{-# LANGUAGE DeriveFunctor, ExistentialQuantification, StandaloneDeriving #-}
module Control.Effect.Writer.Internal
( Writer(..)
) where
import Control.Effect.Class
data Writer w m k
= Tell w (m k)
| forall a . Listen (m a) (w -> a -> m k)
| forall a . Censor (w -> w) (m a) (a -> m k)
deriving instance Functor m => Functor (Writer w m)
instance HFunctor (Writer w) where
hmap f (Tell w k) = Tell w (f k)
hmap f (Listen m k) = Listen (f m) ((f .) . k)
hmap f (Censor g m k) = Censor g (f m) (f . k)
{-# INLINE hmap #-}
instance Effect (Writer w) where
thread ctx handler (Tell w k) = Tell w (handler (k <$ ctx))
thread ctx handler (Listen m k) = Listen (handler (m <$ ctx)) (fmap handler . fmap . k)
thread ctx handler (Censor f m k) = Censor f (handler (m <$ ctx)) (handler . fmap k)
{-# INLINE thread #-}