@@ -0,0 +1,88 @@
1+module Effectful.Writer.Dynamic
19+import Effectful.Internal.Effect
20+import Effectful.Internal.Monad
21+import Effectful.Interpreter
23+import qualified Effectful.Writer as WP
24+import qualified Effectful.Writer.MVar as WM
26+data Writer w :: Effect where
27+ Writer :: (a, w) -> Writer w m a
28+ Tell :: ~w -> Writer w m ()
29+ Listen :: m a -> Writer w m (a, w)
31+----------------------------------------
34+runWriter :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
35+runWriter = reinterpretM WP.runWriter writerPure
37+execWriter :: Monoid w => Eff (Writer w : es) a -> Eff es w
38+execWriter = reinterpretM WP.execWriter writerPure
41+ :: (Monoid w, WP.Writer w :> localEs)
42+ => RunIn es (Eff localEs)
43+ -> Writer w (Eff es) a
45+writerPure run = \case
46+ Writer aw -> WP.writer aw
48+ Listen m -> WP.listen (run m)
50+----------------------------------------
53+runWriterMVar :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
54+runWriterMVar = reinterpretM WM.runWriter writerMVar
56+execWriterMVar :: Monoid w => Eff (Writer w : es) a -> Eff es w
57+execWriterMVar = reinterpretM WM.execWriter writerMVar
60+ :: (Monoid w, WM.Writer w :> localEs)
61+ => RunIn es (Eff localEs)
62+ -> Writer w (Eff es) a
64+writerMVar run = \case
65+ Writer aw -> WM.writer aw
67+ Listen m -> WM.listen (run m)
69+----------------------------------------
72+writer :: (Writer w :> es, Monoid w) => (a, w) -> Eff es a
73+writer = send . Writer
75+tell :: (Writer w :> es, Monoid w) => w -> Eff es ()
78+listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
79+listen = send . Listen
82+ :: (Writer w :> es, Monoid w)