effect-handlers-0.1.0.0: src/Control/Effects/Writer.hs
-- This module provides the familiar writer effect.
module Control.Effects.Writer where
import Control.Effects.Eff
import Data.Monoid
-- |The functor representing the effect. You shouldn't need
-- to create this manually, just use `tell`
data Writer m a = Writer m a deriving (Functor, Typeable)
-- |Send a value into the writer
tell :: (Member (Writer m) r, Typeable m) => m -> Eff r ()
tell m = effect $ \k -> inj $ Writer m $ k ()
-- |Handles writes by `mappend`ing them together.
writerHandler :: (Monoid m) => Handler (Writer m) r a (a, m)
writerHandler (Value a) = return (a, mempty)
writerHandler (Comp (Writer m k)) = do
(a, m') <- k
return (a, m <> m')