0 | module Control.Monad.State.Interface
2 | import Control.Monad.Maybe
3 | import Control.Monad.Error.Either
4 | import Control.Monad.Reader.Reader
5 | import Control.Monad.State.State
6 | import Control.Monad.RWS.CPS
7 | import Control.Monad.Trans
8 | import Control.Monad.Writer.CPS
14 | interface Monad m => MonadState stateType m | m where
18 | put : stateType -> m ()
21 | state : (stateType -> (stateType,a)) -> m a
22 | state f = do s <- get
29 | modify : MonadState stateType m => (stateType -> stateType) -> m ()
36 | gets : MonadState stateType m => (stateType -> a) -> m a
45 | public export %inline
46 | Monad m => MonadState stateType (StateT stateType m) where
47 | get = ST (\x => pure (x, x))
48 | put x = ST (\y => pure (x, ()))
49 | state f = ST $
pure . f
51 | public export %inline
52 | MonadState s m => MonadState s (EitherT e m) where
55 | state = lift . state
57 | public export %inline
58 | MonadState s m => MonadState s (MaybeT m) where
61 | state = lift . state
63 | public export %inline
64 | Monad m => MonadState s (RWST r w s m) where
65 | get = MkRWST $
\_,s,w => pure (s,s,w)
66 | put s = MkRWST $
\_,_,w => pure ((),s,w)
67 | state f = MkRWST $
\_,s,w => let (s',a) = f s in pure (a,s',w)
69 | public export %inline
70 | MonadState s m => MonadState s (ReaderT r m) where
73 | state = lift . state
75 | public export %inline
76 | MonadState s m => MonadState s (WriterT r m) where
79 | state = lift . state