{-# LANGUAGE TemplateHaskell #-}
module Control.Effect.State.Lazy
(
evalState'
, execState'
, runState'
, evalState
, execState
, runState
) where
import Data.Tuple (swap)
import Control.Monad.Trans.State.Lazy (StateT, runStateT)
import Control.Effect.State (State, State')
import Control.Effect.Machinery (Via, makeUntagged, 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 = ((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 (effs :: [Effect]) (t :: Transformer) (m :: * -> *) a.
EachVia effs t m a -> t m a
runVia
{-# 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 = ((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 (effs :: [Effect]) (t :: Transformer) (m :: * -> *) a.
EachVia effs t m a -> t m a
runVia
{-# 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 = ((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 (effs :: [Effect]) (t :: Transformer) (m :: * -> *) a.
EachVia effs t m a -> t m a
runVia
{-# INLINE runState' #-}
makeUntagged ['evalState', 'execState', 'runState']