{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module State where
import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Writer
newtype StateReader r a =
StateReader (State r a)
deriving (Functor, Applicative, Monad)
instance MonadReader r (StateReader r)
where
ask = StateReader get
local mod (StateReader m) =
StateReader $
do
before <- get
modify mod
a <- m
put before
return a
newtype StateWriter w a =
StateWriter (State w a)
deriving (Functor, Applicative, Monad)
instance Monoid w => MonadWriter w (StateWriter w)
where
tell m = StateWriter (modify (`mappend` m))
listen (StateWriter m) =
let (a, s) = runState m mempty
in tell s >> return (a, s)
pass (StateWriter m) =
let ((a, f), s) = runState m mempty
in tell (f s) >> return a