{-# LANGUAGE Trustworthy #-}
module Grisette.Lib.Control.Monad.State.Class
(
mrgGet,
mrgPut,
mrgState,
mrgModify,
mrgModify',
mrgGets,
)
where
import Control.Monad.State.Class (MonadState (get, put))
import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)
import Grisette.Internal.Core.Data.Class.TryMerge (TryMerge, tryMerge)
import Grisette.Lib.Control.Monad (mrgReturn)
mrgGet :: (MonadState s m, TryMerge m, Mergeable s) => m s
mrgGet :: forall s (m :: * -> *).
(MonadState s m, TryMerge m, Mergeable s) =>
m s
mrgGet = m s -> m s
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge m s
forall s (m :: * -> *). MonadState s m => m s
get
{-# INLINE mrgGet #-}
mrgPut :: (MonadState s m, TryMerge m) => s -> m ()
mrgPut :: forall s (m :: * -> *). (MonadState s m, TryMerge m) => s -> m ()
mrgPut = m () -> m ()
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (m () -> m ()) -> (s -> m ()) -> s -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put
{-# INLINE mrgPut #-}
mrgState ::
(MonadState s m, TryMerge m, Mergeable s, Mergeable a) =>
(s -> (a, s)) ->
m a
mrgState :: forall s (m :: * -> *) a.
(MonadState s m, TryMerge m, Mergeable s, Mergeable a) =>
(s -> (a, s)) -> m a
mrgState s -> (a, s)
f = m a -> m a
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (m a -> m a) -> m a -> m a
forall a b. (a -> b) -> a -> b
$ do
s <- m s
forall s (m :: * -> *).
(MonadState s m, TryMerge m, Mergeable s) =>
m s
mrgGet
let ~(a, s') = f s
mrgPut s'
mrgReturn a
mrgModify :: (MonadState s m, TryMerge m, Mergeable s) => (s -> s) -> m ()
mrgModify :: forall s (m :: * -> *).
(MonadState s m, TryMerge m, Mergeable s) =>
(s -> s) -> m ()
mrgModify s -> s
f = (s -> ((), s)) -> m ()
forall s (m :: * -> *) a.
(MonadState s m, TryMerge m, Mergeable s, Mergeable a) =>
(s -> (a, s)) -> m a
mrgState (\s
s -> ((), s -> s
f s
s))
{-# INLINE mrgModify #-}
mrgModify' :: (MonadState s m, TryMerge m, Mergeable s) => (s -> s) -> m ()
mrgModify' :: forall s (m :: * -> *).
(MonadState s m, TryMerge m, Mergeable s) =>
(s -> s) -> m ()
mrgModify' s -> s
f = do
s' <- m s
forall s (m :: * -> *).
(MonadState s m, TryMerge m, Mergeable s) =>
m s
mrgGet
mrgPut $! f s'
{-# INLINE mrgModify' #-}
mrgGets ::
(MonadState s m, TryMerge m, Mergeable s, Mergeable a) =>
(s -> a) ->
m a
mrgGets :: forall s (m :: * -> *) a.
(MonadState s m, TryMerge m, Mergeable s, Mergeable a) =>
(s -> a) -> m a
mrgGets s -> a
f = do
s <- m s
forall s (m :: * -> *).
(MonadState s m, TryMerge m, Mergeable s) =>
m s
mrgGet
mrgReturn $ f s
{-# INLINE mrgGets #-}