0 | module Data.Linear.Sink
2 | import Data.Contravariant
3 | import Data.Linear.Deferred
4 | import Data.Linear.Ref1
6 | import public Data.Linear.Token
19 | cmap : (b -> a) -> Sink a -> Sink b
20 | cmap f (S g) = S $
g . f
23 | Contravariant Sink where
35 | snocSink1 : (0 a : Type) -> IO1 (Sink a, IO1 (List a))
38 | pure (S $
\v => casmod1 ref (:< v), readList ref)
40 | readList : IORef (SnocList a) -> IO1 (List a)
41 | readList ref = casupdate1 ref $
\sv => ([<], sv <>> [])
44 | Semigroup (Sink a) where
45 | S s1 <+> S s2 = S $
\v,t => let _ # t := s1 v t in s2 v t
48 | Monoid (Sink a) where
49 | neutral = S $
\_,t => () # t
52 | sink : HasIO io => (s : Sink a) => a -> io ()
53 | sink = runIO . s.sink1
56 | sinkAs : HasIO io => (0 a : Type) -> (s : Sink a) => a -> io ()
60 | sinkTo : HasIO io => (s : Sink a) -> a -> io ()
61 | sinkTo s = runIO . s.sink1
64 | onceSink : Once World t -> Sink t
65 | onceSink o = S (putOnce1 o)
68 | deferredSink : Deferred World t -> Sink t
69 | deferredSink o = S (putDeferred1 o)