0 | module Control.Eff.Writer
2 | import Control.Eff.Internal
7 | data WriterL : (lbl : k) -> (w : Type) -> (a : Type) -> Type where
9 | Tell : (vw : w) -> WriterL lbl w ()
12 | Writer : (w,a : Type) -> Type
16 | tellAt : (0 lbl : k) -> Has (WriterL lbl w) fs => w -> Eff fs ()
17 | tellAt lbl vw = send $
Tell {lbl} vw
20 | tell : Has (Writer w) fs => w -> Eff fs ()
29 | {0 m : Type -> Type}
30 | -> (tell : w -> m ())
33 | handleWriter tell (Tell vw) = tell vw
35 | unWriter : u -> (u -> w -> u) -> WriterL lbl w a -> (a,u)
36 | unWriter vu f (Tell vw) = ((), f vu vw)
41 | -> {auto _ : Has (WriterL lbl w) fs}
45 | -> Eff (fs - WriterL lbl w) (t,u)
46 | foldWriterAt _ vu acc =
47 | handleRelayS vu (\x,y => pure (y,x)) $
\vu2,w,f =>
48 | let (vv,vu3) := unWriter vu2 acc w
53 | {auto _ : Has (Writer w) fs}
57 | -> Eff (fs - Writer w) (t,u)
58 | foldWriter = foldWriterAt ()
63 | -> {auto _ : Has (WriterL lbl w) fs}
64 | -> {auto _ : Monoid w}
66 | -> Eff (fs - WriterL lbl w) (t,w)
67 | runWriterAt lbl = foldWriterAt lbl neutral (<+>)
71 | Has (Writer w) fs => Monoid w => Eff fs t -> Eff (fs - Writer w) (t,w)
72 | runWriter = runWriterAt ()