on 8a63c15 help sign in
47 lines 1.1 kB history raw
1-- | The 'Writer' as an effect.
2module Effectful.Writer
3 ( Writer
4 , runWriter
5 , execWriter
6 , writer
7 , tell
8 , listen
9 , listens
10 ) where
12import Data.Coerce
13import qualified Data.Semigroup as S
15import Effectful.Internal.Has
16import Effectful.Internal.Monad
18-- | Provide access to a write only value of type @w@.
19newtype Writer w = Writer w
20 deriving (S.Semigroup, Monoid)
22runWriter :: Monoid w => Eff (Writer w : es) a -> Eff es (a, w)
23runWriter = fmap coerce . runEffect mempty
25execWriter :: Monoid w => Eff (Writer w : es) a -> Eff es w
26execWriter = fmap coerce . execEffect mempty
28writer :: (Writer w :> es, Monoid w) => (a, w) -> Eff es a
29writer (a, w) = stateEffect $ \w0 -> (a, w0 `mappend` Writer w)
31tell :: (Writer w :> es, Monoid w) => w -> Eff es ()
32tell w = stateEffect $ \w0 -> ((), w0 `mappend` Writer w)
34listen
35 :: (Writer w :> es, Monoid w)
36 => Eff es a
37 -> Eff es (a, w)
38listen = fmap (\(a, Writer w) -> (a, w)) . listenEffect
40listens
41 :: (Writer w :> es, Monoid w)
42 => (w -> b)
43 -> Eff es a
44 -> Eff es (a, b)
45listens f m = do
46 (a, w) <- listen m
47 pure (a, f w)