module Language.Haskell.TH.TypeGraph.HasState
( HasState(getState, modifyState)
) where
import Control.Monad.Reader (ReaderT)
import Control.Monad.RWS (RWST)
import Control.Monad.State (StateT, get, modify)
import Control.Monad.Trans (lift)
import Control.Monad.Writer (WriterT)
class HasState s m where
getState :: m s
modifyState :: (s -> s) -> m ()
instance Monad m => HasState s (StateT s m) where
getState = get
modifyState = modify
instance (Monad m, Monoid w) => HasState s (RWST r w s m) where
getState = get
modifyState = modify
instance (Monad m, HasState s m) => HasState s (ReaderT r m) where
getState = lift getState
modifyState f = lift $ modifyState f
instance (Monad m, Monoid w, HasState s m) => HasState s (WriterT w m) where
getState = lift getState
modifyState f = lift $ modifyState f