module Control.Effect.State.Strict
(
evalState'
, execState'
, runState'
, evalState
, execState
, runState
) where
import Data.Tuple (swap)
import Control.Monad.Trans.State.Strict (StateT, runStateT)
import Control.Effect.State (State, State')
import Control.Effect.Machinery (G, Via, runVia)
evalState' :: forall tag s m a. Functor m
=> s
-> (State' tag s `Via` StateT s) m a
-> m a
evalState' :: s -> Via (State' tag s) (StateT s) m a -> m a
evalState' s :: s
s = ((a, s) -> a) -> m (a, s) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, s) -> a
forall a b. (a, b) -> a
fst (m (a, s) -> m a)
-> (Via (State' tag s) (StateT s) m a -> m (a, s))
-> Via (State' tag s) (StateT s) m a
-> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StateT s m a -> s -> m (a, s)) -> s -> StateT s m a -> m (a, s)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT s m a -> s -> m (a, s)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT s
s (StateT s m a -> m (a, s))
-> (Via (State' tag s) (StateT s) m a -> StateT s m a)
-> Via (State' tag s) (StateT s) m a
-> m (a, s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Via (State' tag s) (StateT s) m a -> StateT s m a
forall (eff :: Effect) (t :: Transformer) (m :: * -> *) a.
Via eff t m a -> t m a
runVia
{-# INLINE evalState' #-}
evalState :: Functor m => s -> (State s `Via` StateT s) m a -> m a
evalState :: s -> Via (State s) (StateT s) m a -> m a
evalState = forall k (tag :: k) s (m :: * -> *) a.
Functor m =>
s -> Via (State' tag s) (StateT s) m a -> m a
forall s (m :: * -> *) a.
Functor m =>
s -> Via (State' G s) (StateT s) m a -> m a
evalState' @G
{-# INLINE evalState #-}
execState' :: forall tag s m a. Functor m
=> s
-> (State' tag s `Via` StateT s) m a
-> m s
execState' :: s -> Via (State' tag s) (StateT s) m a -> m s
execState' s :: s
s = ((a, s) -> s) -> m (a, s) -> m s
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, s) -> s
forall a b. (a, b) -> b
snd (m (a, s) -> m s)
-> (Via (State' tag s) (StateT s) m a -> m (a, s))
-> Via (State' tag s) (StateT s) m a
-> m s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StateT s m a -> s -> m (a, s)) -> s -> StateT s m a -> m (a, s)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT s m a -> s -> m (a, s)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT s
s (StateT s m a -> m (a, s))
-> (Via (State' tag s) (StateT s) m a -> StateT s m a)
-> Via (State' tag s) (StateT s) m a
-> m (a, s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Via (State' tag s) (StateT s) m a -> StateT s m a
forall (eff :: Effect) (t :: Transformer) (m :: * -> *) a.
Via eff t m a -> t m a
runVia
{-# INLINE execState' #-}
execState :: Functor m => s -> (State s `Via` StateT s) m a -> m s
execState :: s -> Via (State s) (StateT s) m a -> m s
execState = forall k (tag :: k) s (m :: * -> *) a.
Functor m =>
s -> Via (State' tag s) (StateT s) m a -> m s
forall s (m :: * -> *) a.
Functor m =>
s -> Via (State' G s) (StateT s) m a -> m s
execState' @G
{-# INLINE execState #-}
runState' :: forall tag s m a. Functor m
=> s
-> (State' tag s `Via` StateT s) m a
-> m (s, a)
runState' :: s -> Via (State' tag s) (StateT s) m a -> m (s, a)
runState' s :: s
s = ((a, s) -> (s, a)) -> m (a, s) -> m (s, a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, s) -> (s, a)
forall a b. (a, b) -> (b, a)
swap (m (a, s) -> m (s, a))
-> (Via (State' tag s) (StateT s) m a -> m (a, s))
-> Via (State' tag s) (StateT s) m a
-> m (s, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StateT s m a -> s -> m (a, s)) -> s -> StateT s m a -> m (a, s)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT s m a -> s -> m (a, s)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT s
s (StateT s m a -> m (a, s))
-> (Via (State' tag s) (StateT s) m a -> StateT s m a)
-> Via (State' tag s) (StateT s) m a
-> m (a, s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Via (State' tag s) (StateT s) m a -> StateT s m a
forall (eff :: Effect) (t :: Transformer) (m :: * -> *) a.
Via eff t m a -> t m a
runVia
{-# INLINE runState' #-}
runState :: Functor m => s -> (State s `Via` StateT s) m a -> m (s, a)
runState :: s -> Via (State s) (StateT s) m a -> m (s, a)
runState = forall k (tag :: k) s (m :: * -> *) a.
Functor m =>
s -> Via (State' tag s) (StateT s) m a -> m (s, a)
forall s (m :: * -> *) a.
Functor m =>
s -> Via (State' G s) (StateT s) m a -> m (s, a)
runState' @G
{-# INLINE runState #-}