on b42e0dc help sign in
88 lines 2.0 kB history raw
1module Effectful.Writer.Dynamic
2 ( Writer(..)
4 -- * Pure
5 , runWriter
6 , execWriter
8 -- * MVar
9 , runWriterMVar
10 , execWriterMVar
12 -- * Operations
13 , writer
14 , tell
15 , listen
16 , listens
17 ) where
19import Effectful.Internal.Effect
20import Effectful.Internal.Monad
21import Effectful.Interpreter
23import qualified Effectful.Writer as WP
24import qualified Effectful.Writer.MVar as WM
26data 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----------------------------------------
32-- Pure
34runWriter :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
35runWriter = reinterpretM WP.runWriter writerPure
37execWriter :: Monoid w => Eff (Writer w : es) a -> Eff es w
38execWriter = reinterpretM WP.execWriter writerPure
40writerPure
41 :: (WP.Writer w :> localEs, Monoid w)
42 => RunIn es (Eff localEs)
43 -> Writer w (Eff es) a
44 -> Eff localEs a
45writerPure run = \case
46 Writer aw -> WP.writer aw
47 Tell w -> WP.tell w
48 Listen m -> WP.listen (run m)
50----------------------------------------
51-- MVar
53runWriterMVar :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
54runWriterMVar = reinterpretM WM.runWriter writerMVar
56execWriterMVar :: Monoid w => Eff (Writer w : es) a -> Eff es w
57execWriterMVar = reinterpretM WM.execWriter writerMVar
59writerMVar
60 :: (WM.Writer w :> localEs, Monoid w)
61 => RunIn es (Eff localEs)
62 -> Writer w (Eff es) a
63 -> Eff localEs a
64writerMVar run = \case
65 Writer aw -> WM.writer aw
66 Tell w -> WM.tell w
67 Listen m -> WM.listen (run m)
69----------------------------------------
70-- Operations
72writer :: (Writer w :> es, Monoid w) => (a, w) -> Eff es a
73writer = send . Writer
75tell :: (Writer w :> es, Monoid w) => w -> Eff es ()
76tell = send . Tell
78listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
79listen = send . Listen
81listens
82 :: (Writer w :> es, Monoid w)
83 => (w -> b)
84 -> Eff es a
85 -> Eff es (a, b)
86listens f m = do
87 (a, w) <- listen m
88 pure (a, f w)