{-# LANGUAGE MultiParamTypeClasses, TypeFamilies, FlexibleContexts #-} module Control.Effects.Writer where import Control.Effects import Data.Monoid tell :: (c ~ ContT (w, r) m, AutoLift c n, Monad m, Monoid w) => Proxy c -> w -> n () tell p w = operation p $ \k -> do (w', r) <- k (); return (w `mappend` w', r) writer :: (Monad m, Monoid w) => Handler (w, a) m a (w, a) writer = Handler { ret = \a -> return (mempty, a) , fin = return }