#if __GLASGOW_HASKELL__ < 710
#endif
module Control.Monad.Ether.State.Class
( MonadState(..)
, modify
, gets
) where
import qualified Control.Monad.Trans.Ether.State.Lazy as S.L
import qualified Control.Monad.Trans.Ether.State.Strict as S.S
import qualified Control.Monad.Trans as Lift
import qualified Control.Ether.Util as Util
class Monad m => MonadState tag s m | m tag -> s where
get :: proxy tag -> m s
get t = state t (\s -> (s, s))
put :: proxy tag -> s -> m ()
put t s = state t (\_ -> ((), s))
state :: proxy tag -> (s -> (a, s)) -> m a
state t f = do
s <- get t
let ~(a, s') = f s
put t s'
return a
modify :: MonadState tag s m => proxy tag -> (s -> s) -> m ()
modify t f = state t (\s -> ((), f s))
gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
gets t f = Util.fmap f (get t)
instance (Monad m, s ~ s') => MonadState tag s (S.L.StateT tag s' m) where
get = S.L.get
put = S.L.put
state = S.L.state
instance (Monad m, s ~ s') => MonadState tag s (S.S.StateT tag s' m) where
get = S.S.get
put = S.S.put
state = S.S.state
instance
( Lift.MonadTrans t
, Monad (t m)
, MonadState tag s m
) => MonadState tag s (t m) where
get t = Lift.lift (get t)
put t = Lift.lift . put t
state t = Lift.lift . state t