on d728875 help sign in
77 lines 1.8 kB history raw
1module Effectful.Writer.Dynamic
2 ( Writer(..)
4 -- * Pure
5 , runWriter
6 , execWriter
8 -- * MVar
9 , runWriterMVar
10 , execWriterMVar
12 -- * Operations
13 , tell
14 , listen
15 , listens
16 ) where
18import Effectful.Internal.Effect
19import Effectful.Internal.Monad
20import Effectful.Interpreter
22import qualified Effectful.Writer as WP
23import qualified Effectful.Writer.MVar as WM
25data Writer w :: Effect where
26 Tell :: ~w -> Writer w m ()
27 Listen :: m a -> Writer w m (a, w)
29----------------------------------------
30-- Pure
32runWriter :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
33runWriter = reinterpretM WP.runWriter writerPure
35execWriter :: Monoid w => Eff (Writer w : es) a -> Eff es w
36execWriter = reinterpretM WP.execWriter writerPure
38writerPure
39 :: (WP.Writer w :> localEs, Monoid w)
40 => RunIn es (Eff localEs)
41 -> Writer w (Eff es) a
42 -> Eff localEs a
43writerPure run = \case
44 Tell w -> WP.tell w
45 Listen m -> WP.listen (run m)
47----------------------------------------
48-- MVar
50runWriterMVar :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
51runWriterMVar = reinterpretM WM.runWriter writerMVar
53execWriterMVar :: Monoid w => Eff (Writer w : es) a -> Eff es w
54execWriterMVar = reinterpretM WM.execWriter writerMVar
56writerMVar
57 :: (WM.Writer w :> localEs, Monoid w)
58 => RunIn es (Eff localEs)
59 -> Writer w (Eff es) a
60 -> Eff localEs a
61writerMVar run = \case
62 Tell w -> WM.tell w
63 Listen m -> WM.listen (run m)
65----------------------------------------
66-- Operations
68tell :: (Writer w :> es, Monoid w) => w -> Eff es ()
69tell = send . Tell
71listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
72listen = send . Listen
74listens :: (Writer w :> es, Monoid w) => (w -> b) -> Eff es a -> Eff es (a, b)
75listens f m = do
76 (a, w) <- listen m
77 pure (a, f w)