{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Safe #-}
{-# LANGUAGE DeriveGeneric #-}
#endif
#if __GLASGOW_HASKELL__ >= 710 && __GLASGOW_HASKELL__ < 802
{-# LANGUAGE AutoDeriveTypeable #-}
#endif
module Control.Monad.Trans.State.Lazy (
State,
state,
runState,
evalState,
execState,
mapState,
withState,
StateT(..),
evalStateT,
execStateT,
mapStateT,
withStateT,
get,
put,
modify,
modify',
gets,
liftCallCC,
liftCallCC',
liftCatch,
liftListen,
liftPass,
) where
import Control.Monad.IO.Class
import Control.Monad.Signatures
import Control.Monad.Trans.Class
#if MIN_VERSION_base(4,12,0)
import Data.Functor.Contravariant
#endif
import Data.Functor.Identity
import Control.Applicative
import Control.Monad
#if MIN_VERSION_base(4,9,0)
import qualified Control.Monad.Fail as Fail
#endif
import Control.Monad.Fix
#if __GLASGOW_HASKELL__ >= 704
import GHC.Generics
#endif
type State s = StateT s Identity
state :: (Monad m)
=> (s -> (a, s))
-> StateT s m a
state :: forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state s -> (a, s)
f = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> (a, s)
f)
{-# INLINE state #-}
runState :: State s a
-> s
-> (a, s)
runState :: forall s a. State s a -> s -> (a, s)
runState State s a
m = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT State s a
m
{-# INLINE runState #-}
evalState :: State s a
-> s
-> a
evalState :: forall s a. State s a -> s -> a
evalState State s a
m s
s = forall a b. (a, b) -> a
fst (forall s a. State s a -> s -> (a, s)
runState State s a
m s
s)
{-# INLINE evalState #-}
execState :: State s a
-> s
-> s
execState :: forall s a. State s a -> s -> s
execState State s a
m s
s = forall a b. (a, b) -> b
snd (forall s a. State s a -> s -> (a, s)
runState State s a
m s
s)
{-# INLINE execState #-}
mapState :: ((a, s) -> (b, s)) -> State s a -> State s b
mapState :: forall a s b. ((a, s) -> (b, s)) -> State s a -> State s b
mapState (a, s) -> (b, s)
f = forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
mapStateT (forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, s) -> (b, s)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Identity a -> a
runIdentity)
{-# INLINE mapState #-}
withState :: (s -> s) -> State s a -> State s a
withState :: forall s a. (s -> s) -> State s a -> State s a
withState = forall s (m :: * -> *) a. (s -> s) -> StateT s m a -> StateT s m a
withStateT
{-# INLINE withState #-}
newtype StateT s m a = StateT { forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT :: s -> m (a,s) }
#if __GLASGOW_HASKELL__ >= 704
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall s (m :: * -> *) a x. Rep (StateT s m a) x -> StateT s m a
forall s (m :: * -> *) a x. StateT s m a -> Rep (StateT s m a) x
$cto :: forall s (m :: * -> *) a x. Rep (StateT s m a) x -> StateT s m a
$cfrom :: forall s (m :: * -> *) a x. StateT s m a -> Rep (StateT s m a) x
Generic)
#endif
evalStateT :: (Monad m) => StateT s m a -> s -> m a
evalStateT :: forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT StateT s m a
m s
s = do
~(a
a, s
_) <- forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
s
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
{-# INLINE evalStateT #-}
execStateT :: (Monad m) => StateT s m a -> s -> m s
execStateT :: forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m s
execStateT StateT s m a
m s
s = do
~(a
_, s
s') <- forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
s
forall (m :: * -> *) a. Monad m => a -> m a
return s
s'
{-# INLINE execStateT #-}
mapStateT :: (m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
mapStateT :: forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
mapStateT m (a, s) -> n (b, s)
f StateT s m a
m = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ m (a, s) -> n (b, s)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m
{-# INLINE mapStateT #-}
withStateT :: (s -> s) -> StateT s m a -> StateT s m a
withStateT :: forall s (m :: * -> *) a. (s -> s) -> StateT s m a -> StateT s m a
withStateT s -> s
f StateT s m a
m = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> s
f
{-# INLINE withStateT #-}
instance (Functor m) => Functor (StateT s m) where
fmap :: forall a b. (a -> b) -> StateT s m a -> StateT s m b
fmap a -> b
f StateT s m a
m = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s ->
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\ ~(a
a, s
s') -> (a -> b
f a
a, s
s')) forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
s
{-# INLINE fmap #-}
instance (Functor m, Monad m) => Applicative (StateT s m) where
pure :: forall a. a -> StateT s m a
pure a
a = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return (a
a, s
s)
{-# INLINE pure #-}
StateT s -> m (a -> b, s)
mf <*> :: forall a b. StateT s m (a -> b) -> StateT s m a -> StateT s m b
<*> StateT s -> m (a, s)
mx = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> do
~(a -> b
f, s
s') <- s -> m (a -> b, s)
mf s
s
~(a
x, s
s'') <- s -> m (a, s)
mx s
s'
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> b
f a
x, s
s'')
{-# INLINE (<*>) #-}
StateT s m a
m *> :: forall a b. StateT s m a -> StateT s m b -> StateT s m b
*> StateT s m b
k = StateT s m a
m forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
_ -> StateT s m b
k
{-# INLINE (*>) #-}
instance (Functor m, MonadPlus m) => Alternative (StateT s m) where
empty :: forall a. StateT s m a
empty = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
_ -> forall (m :: * -> *) a. MonadPlus m => m a
mzero
{-# INLINE empty #-}
StateT s -> m (a, s)
m <|> :: forall a. StateT s m a -> StateT s m a -> StateT s m a
<|> StateT s -> m (a, s)
n = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> s -> m (a, s)
m s
s forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` s -> m (a, s)
n s
s
{-# INLINE (<|>) #-}
instance (Monad m) => Monad (StateT s m) where
#if !(MIN_VERSION_base(4,8,0))
return a = StateT $ \ s -> return (a, s)
{-# INLINE return #-}
#endif
StateT s m a
m >>= :: forall a b. StateT s m a -> (a -> StateT s m b) -> StateT s m b
>>= a -> StateT s m b
k = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> do
~(a
a, s
s') <- forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
s
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (a -> StateT s m b
k a
a) s
s'
{-# INLINE (>>=) #-}
#if !(MIN_VERSION_base(4,13,0))
fail str = StateT $ \ _ -> fail str
{-# INLINE fail #-}
#endif
#if MIN_VERSION_base(4,9,0)
instance (Fail.MonadFail m) => Fail.MonadFail (StateT s m) where
fail :: forall a. String -> StateT s m a
fail String
str = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
Fail.fail String
str
{-# INLINE fail #-}
#endif
instance (MonadPlus m) => MonadPlus (StateT s m) where
mzero :: forall a. StateT s m a
mzero = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
_ -> forall (m :: * -> *) a. MonadPlus m => m a
mzero
{-# INLINE mzero #-}
StateT s -> m (a, s)
m mplus :: forall a. StateT s m a -> StateT s m a -> StateT s m a
`mplus` StateT s -> m (a, s)
n = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> s -> m (a, s)
m s
s forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` s -> m (a, s)
n s
s
{-# INLINE mplus #-}
instance (MonadFix m) => MonadFix (StateT s m) where
mfix :: forall a. (a -> StateT s m a) -> StateT s m a
mfix a -> StateT s m a
f = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
mfix forall a b. (a -> b) -> a -> b
$ \ ~(a
a, s
_) -> forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (a -> StateT s m a
f a
a) s
s
{-# INLINE mfix #-}
instance MonadTrans (StateT s) where
lift :: forall (m :: * -> *) a. Monad m => m a -> StateT s m a
lift m a
m = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> do
a
a <- m a
m
forall (m :: * -> *) a. Monad m => a -> m a
return (a
a, s
s)
{-# INLINE lift #-}
instance (MonadIO m) => MonadIO (StateT s m) where
liftIO :: forall a. IO a -> StateT s m a
liftIO = 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 (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
{-# INLINE liftIO #-}
#if MIN_VERSION_base(4,12,0)
instance Contravariant m => Contravariant (StateT s m) where
contramap :: forall a' a. (a' -> a) -> StateT s m a -> StateT s m a'
contramap a' -> a
f StateT s m a
m = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \s
s ->
forall (f :: * -> *) a' a.
Contravariant f =>
(a' -> a) -> f a -> f a'
contramap (\ ~(a'
a, s
s') -> (a' -> a
f a'
a, s
s')) forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
s
{-# INLINE contramap #-}
#endif
get :: (Monad m) => StateT s m s
get :: forall (m :: * -> *) s. Monad m => StateT s m s
get = forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall a b. (a -> b) -> a -> b
$ \ s
s -> (s
s, s
s)
{-# INLINE get #-}
put :: (Monad m) => s -> StateT s m ()
put :: forall (m :: * -> *) s. Monad m => s -> StateT s m ()
put s
s = forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall a b. (a -> b) -> a -> b
$ \ s
_ -> ((), s
s)
{-# INLINE put #-}
modify :: (Monad m) => (s -> s) -> StateT s m ()
modify :: forall (m :: * -> *) s. Monad m => (s -> s) -> StateT s m ()
modify s -> s
f = forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall a b. (a -> b) -> a -> b
$ \ s
s -> ((), s -> s
f s
s)
{-# INLINE modify #-}
modify' :: (Monad m) => (s -> s) -> StateT s m ()
modify' :: forall (m :: * -> *) s. Monad m => (s -> s) -> StateT s m ()
modify' s -> s
f = do
s
s <- forall (m :: * -> *) s. Monad m => StateT s m s
get
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
put forall a b. (a -> b) -> a -> b
$! s -> s
f s
s
{-# INLINE modify' #-}
gets :: (Monad m) => (s -> a) -> StateT s m a
gets :: forall (m :: * -> *) s a. Monad m => (s -> a) -> StateT s m a
gets s -> a
f = forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall a b. (a -> b) -> a -> b
$ \ s
s -> (s -> a
f s
s, s
s)
{-# INLINE gets #-}
liftCallCC :: CallCC m (a,s) (b,s) -> CallCC (StateT s m) a b
liftCallCC :: forall (m :: * -> *) a s b.
CallCC m (a, s) (b, s) -> CallCC (StateT s m) a b
liftCallCC CallCC m (a, s) (b, s)
callCC (a -> StateT s m b) -> StateT s m a
f = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s ->
CallCC m (a, s) (b, s)
callCC forall a b. (a -> b) -> a -> b
$ \ (a, s) -> m (b, s)
c ->
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT ((a -> StateT s m b) -> StateT s m a
f (\ a
a -> forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
_ -> (a, s) -> m (b, s)
c (a
a, s
s))) s
s
{-# INLINE liftCallCC #-}
liftCallCC' :: CallCC m (a,s) (b,s) -> CallCC (StateT s m) a b
liftCallCC' :: forall (m :: * -> *) a s b.
CallCC m (a, s) (b, s) -> CallCC (StateT s m) a b
liftCallCC' CallCC m (a, s) (b, s)
callCC (a -> StateT s m b) -> StateT s m a
f = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s ->
CallCC m (a, s) (b, s)
callCC forall a b. (a -> b) -> a -> b
$ \ (a, s) -> m (b, s)
c ->
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT ((a -> StateT s m b) -> StateT s m a
f (\ a
a -> forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s' -> (a, s) -> m (b, s)
c (a
a, s
s'))) s
s
{-# INLINE liftCallCC' #-}
liftCatch :: Catch e m (a,s) -> Catch e (StateT s m) a
liftCatch :: forall e (m :: * -> *) a s.
Catch e m (a, s) -> Catch e (StateT s m) a
liftCatch Catch e m (a, s)
catchE StateT s m a
m e -> StateT s m a
h =
forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
s Catch e m (a, s)
`catchE` \ e
e -> forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (e -> StateT s m a
h e
e) s
s
{-# INLINE liftCatch #-}
liftListen :: (Monad m) => Listen w m (a,s) -> Listen w (StateT s m) a
liftListen :: forall (m :: * -> *) w a s.
Monad m =>
Listen w m (a, s) -> Listen w (StateT s m) a
liftListen Listen w m (a, s)
listen StateT s m a
m = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> do
~((a
a, s
s'), w
w) <- Listen w m (a, s)
listen (forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
s)
forall (m :: * -> *) a. Monad m => a -> m a
return ((a
a, w
w), s
s')
{-# INLINE liftListen #-}
liftPass :: (Monad m) => Pass w m (a,s) -> Pass w (StateT s m) a
liftPass :: forall (m :: * -> *) w a s.
Monad m =>
Pass w m (a, s) -> Pass w (StateT s m) a
liftPass Pass w m (a, s)
pass StateT s m (a, w -> w)
m = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \ s
s -> Pass w m (a, s)
pass forall a b. (a -> b) -> a -> b
$ do
~((a
a, w -> w
f), s
s') <- forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m (a, w -> w)
m s
s
forall (m :: * -> *) a. Monad m => a -> m a
return ((a
a, s
s'), w -> w
f)
{-# INLINE liftPass #-}