0 | module Control.Effect.Writer
2 | import Control.EffectAlgebra
4 | import Control.Monad.Writer
8 | data WriterE : Type -> (Type -> Type) -> Type -> Type where
9 | Tell : w -> WriterE w m ()
12 | Functor (\w => WriterE w m a) where
13 | map f (Tell x) = Tell (f x)
17 | tell : Inj (WriterE w) sig => Algebra sig m => w -> m ()
18 | tell s = send (Tell s)
23 | [Overwrite] Algebra sig m => Algebra (WriterE s :+: sig) (WriterT s m) where
24 | alg ctx hdl (Inl (Tell s)) = MkWriterT $
\_ => pure (ctx, s)
25 | alg ctxx hdl (Inr x) = MkWriterT $
\r => do
27 | {f = Functor.Compose @{Functor.LeftPair}}
31 | h : Handler ((,s) . ctx) n m
33 | (~<~) {g = Functor.LeftPair}
34 | {ctx1 = (,s), ctx2 = ctx}
36 | {m = WriterT s m} {n = m} (uncurry unWriterT) hdl
40 | [ConcatLeft] Monoid s => Algebra sig m => Algebra (WriterE s :+: sig) (WriterT s m) where
41 | alg ctxx hdl (Inl (Tell s)) = MkWriterT $
\s' => pure (ctxx, (s <+> s'))
42 | alg ctxx hdl (Inr x) = MkWriterT $
\r => do
47 | {f = Functor.Compose @{Functor.LeftPair}}
51 | h : Handler ((,s) . ctx) n m
53 | (~<~) {g = Functor.LeftPair}
54 | {ctx1 = (,s), ctx2 = ctx}
56 | {m = WriterT s m} {n = m} (uncurry unWriterT) hdl