(original) (raw)
{-# LANGUAGE Safe #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Control.Monad.State.Class ( MonadState(..), modify, modify', gets ) where
import Control.Monad.Trans.Cont (ContT) import Control.Monad.Trans.Except (ExceptT) import Control.Monad.Trans.Identity (IdentityT) import Control.Monad.Trans.Maybe (MaybeT) import Control.Monad.Trans.Reader (ReaderT) import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS import qualified Control.Monad.Trans.RWS.Strict as StrictRWS import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.State.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import Control.Monad.Trans.Accum (AccumT) import Control.Monad.Trans.Select (SelectT) import qualified Control.Monad.Trans.RWS.CPS as CPSRWS import qualified Control.Monad.Trans.Writer.CPS as CPS import Control.Monad.Trans.Class (lift)
class Monad m => MonadState s m | m -> s where
[get](Control.Monad.State.Class.html#get) :: [m](#local-6989586621679046908) [s](#local-6989586621679046909)
[get](Control.Monad.State.Class.html#get) = forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a
[put](Control.Monad.State.Class.html#put) :: [s](#local-6989586621679046909) -> [m](#local-6989586621679046908) ()
[put](Control.Monad.State.Class.html#put) s
s = forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state (\s _ -> ((), s s))
[state](Control.Monad.State.Class.html#state) :: ([s](#local-6989586621679046909) -> ([a](#local-6989586621679046906), [s](#local-6989586621679046909))) -> [m](#local-6989586621679046908) [a](#local-6989586621679046906)
[state](Control.Monad.State.Class.html#state) s -> (a, s)
f = do s s <- forall s (m :: * -> *). MonadState s m => m s get let ~(a a, s s') = s -> (a, s) f s s forall s (m :: * -> *). MonadState s m => s -> m () put s s' forall (m :: * -> *) a. Monad m => a -> m a return a a {-# MINIMAL state | get, put #-}
modify :: MonadState s m => (s -> s) -> m () modify :: forall s (m :: * -> *). MonadState s m => (s -> s) -> m () modify s -> s f = forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state (\s s -> ((), s -> s f s s))
modify' :: MonadState s m => (s -> s) -> m () modify' :: forall s (m :: * -> *). MonadState s m => (s -> s) -> m () modify' s -> s f = do s s' <- forall s (m :: * -> *). MonadState s m => m s get forall s (m :: * -> *). MonadState s m => s -> m () put forall a b. (a -> b) -> a -> b $! s -> s f s s'
gets :: MonadState s m => (s -> a) -> m a gets :: forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a gets s -> a f = do s s <- forall s (m :: * -> *). MonadState s m => m s get forall (m :: * -> *) a. Monad m => a -> m a return (s -> a f s s)
instance Monad m => MonadState s (Lazy.StateT s m) where get :: StateT s m s get = forall (m :: * -> *) s. Monad m => StateT s m s Lazy.get put :: s -> StateT s m () put = forall (m :: * -> *) s. Monad m => s -> StateT s m () Lazy.put state :: forall a. (s -> (a, s)) -> StateT s m a state = forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a Lazy.state
instance Monad m => MonadState s (Strict.StateT s m) where get :: StateT s m s get = forall (m :: * -> *) s. Monad m => StateT s m s Strict.get put :: s -> StateT s m () put = forall (m :: * -> *) s. Monad m => s -> StateT s m () Strict.put state :: forall a. (s -> (a, s)) -> StateT s m a state = forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a Strict.state
instance (Monad m, Monoid w) => MonadState s (CPSRWS.RWST r w s m) where get :: RWST r w s m s get = forall (m :: * -> *) r w s. Monad m => RWST r w s m s CPSRWS.get put :: s -> RWST r w s m () put = forall (m :: * -> *) s r w. Monad m => s -> RWST r w s m () CPSRWS.put state :: forall a. (s -> (a, s)) -> RWST r w s m a state = forall (m :: * -> *) s a r w. Monad m => (s -> (a, s)) -> RWST r w s m a CPSRWS.state
instance (Monad m, Monoid w) => MonadState s (LazyRWS.RWST r w s m) where get :: RWST r w s m s get = forall w (m :: * -> *) r s. (Monoid w, Monad m) => RWST r w s m s LazyRWS.get put :: s -> RWST r w s m () put = forall w (m :: * -> *) s r. (Monoid w, Monad m) => s -> RWST r w s m () LazyRWS.put state :: forall a. (s -> (a, s)) -> RWST r w s m a state = forall w (m :: * -> *) s a r. (Monoid w, Monad m) => (s -> (a, s)) -> RWST r w s m a LazyRWS.state
instance (Monad m, Monoid w) => MonadState s (StrictRWS.RWST r w s m) where get :: RWST r w s m s get = forall w (m :: * -> *) r s. (Monoid w, Monad m) => RWST r w s m s StrictRWS.get put :: s -> RWST r w s m () put = forall w (m :: * -> *) s r. (Monoid w, Monad m) => s -> RWST r w s m () StrictRWS.put state :: forall a. (s -> (a, s)) -> RWST r w s m a state = forall w (m :: * -> *) s a r. (Monoid w, Monad m) => (s -> (a, s)) -> RWST r w s m a StrictRWS.state
instance MonadState s m => MonadState s (ContT r m) where get :: ContT r m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> ContT r m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> ContT r m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance MonadState s m => MonadState s (ExceptT e m) where get :: ExceptT e m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> ExceptT e m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> ExceptT e m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance MonadState s m => MonadState s (IdentityT m) where get :: IdentityT m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> IdentityT m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> IdentityT m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance MonadState s m => MonadState s (MaybeT m) where get :: MaybeT m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> MaybeT m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> MaybeT m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance MonadState s m => MonadState s (ReaderT r m) where get :: ReaderT r m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> ReaderT r m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> ReaderT r m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance (Monoid w, MonadState s m) => MonadState s (CPS.WriterT w m) where get :: WriterT w m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> WriterT w m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> WriterT w m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance (Monoid w, MonadState s m) => MonadState s (Lazy.WriterT w m) where get :: WriterT w m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> WriterT w m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> WriterT w m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance (Monoid w, MonadState s m) => MonadState s (Strict.WriterT w m) where get :: WriterT w m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> WriterT w m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> WriterT w m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance ( Monoid w , MonadState s m ) => MonadState s (AccumT w m) where get :: AccumT w m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> AccumT w m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> AccumT w m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state
instance MonadState s m => MonadState s (SelectT r m) where get :: SelectT r m s get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall s (m :: * -> ). MonadState s m => m s get put :: s -> SelectT r m () put = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> ). MonadState s m => s -> m () put state :: forall a. (s -> (a, s)) -> SelectT r m a state = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a state