on 043bffe help sign in
75 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.Interpreter
19import Effectful.Monad
20import qualified Effectful.Writer as WP
21import qualified Effectful.Writer.MVar as WM
23data Writer w :: Effect where
24 Tell :: ~w -> Writer w m ()
25 Listen :: m a -> Writer w m (a, w)
27----------------------------------------
28-- Pure
30runWriter :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
31runWriter = reinterpretM WP.runWriter writerPure
33execWriter :: Monoid w => Eff (Writer w : es) a -> Eff es w
34execWriter = reinterpretM WP.execWriter writerPure
36writerPure
37 :: (WP.Writer w :> es, Monoid w)
38 => LocalEnv localEs
39 -> Writer w (Eff localEs) a
40 -> Eff es a
41writerPure env = \case
42 Tell w -> WP.tell w
43 Listen m -> localSeqUnlift env $ \run -> WP.listen (run m)
45----------------------------------------
46-- MVar
48runWriterMVar :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
49runWriterMVar = reinterpretM WM.runWriter writerMVar
51execWriterMVar :: Monoid w => Eff (Writer w : es) a -> Eff es w
52execWriterMVar = reinterpretM WM.execWriter writerMVar
54writerMVar
55 :: (WM.Writer w :> es, Monoid w)
56 => LocalEnv localEs
57 -> Writer w (Eff localEs) a
58 -> Eff es a
59writerMVar env = \case
60 Tell w -> WM.tell w
61 Listen m -> localSeqUnlift env $ \run -> WM.listen (run m)
63----------------------------------------
64-- Operations
66tell :: (Writer w :> es, Monoid w) => w -> Eff es ()
67tell = send . Tell
69listen :: (Writer w :> es, Monoid w) => Eff es a -> Eff es (a, w)
70listen = send . Listen
72listens :: (Writer w :> es, Monoid w) => (w -> b) -> Eff es a -> Eff es (a, b)
73listens f m = do
74 (a, w) <- listen m
75 pure (a, f w)