module Data.Accessor.Monad.MTL.State where
import qualified Data.Accessor.Basic as Accessor
import qualified Control.Monad.State as State
import qualified Control.Monad.Trans as Trans
import Control.Monad.State (MonadState, State, runState, StateT(runStateT), )
import Control.Monad.Trans (MonadTrans, )
set :: MonadState r m => Accessor.T r a -> a -> m ()
set :: T r a -> a -> m ()
set f :: T r a
f x :: a
x = (r -> r) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
State.modify (T r a -> a -> r -> r
forall r a. T r a -> a -> r -> r
Accessor.set T r a
f a
x)
get :: MonadState r m => Accessor.T r a -> m a
get :: T r a -> m a
get f :: T r a
f = (r -> a) -> m a
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
State.gets (T r a -> r -> a
forall r a. T r a -> r -> a
Accessor.get T r a
f)
modify :: MonadState r m => Accessor.T r a -> (a -> a) -> m ()
modify :: T r a -> (a -> a) -> m ()
modify f :: T r a
f g :: a -> a
g = (r -> r) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
State.modify (T r a -> (a -> a) -> r -> r
forall r a. T r a -> (a -> a) -> r -> r
Accessor.modify T r a
f a -> a
g)
getAndModify :: MonadState r m => Accessor.T r a -> (a -> a) -> m a
getAndModify :: T r a -> (a -> a) -> m a
getAndModify f :: T r a
f g :: a -> a
g =
do a
x <- T r a -> m a
forall r (m :: * -> *) a. MonadState r m => T r a -> m a
get T r a
f
T r a -> (a -> a) -> m ()
forall r (m :: * -> *) a.
MonadState r m =>
T r a -> (a -> a) -> m ()
modify T r a
f a -> a
g
a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
modifyAndGet :: MonadState r m => Accessor.T r a -> (a -> a) -> m a
modifyAndGet :: T r a -> (a -> a) -> m a
modifyAndGet f :: T r a
f g :: a -> a
g =
do T r a -> (a -> a) -> m ()
forall r (m :: * -> *) a.
MonadState r m =>
T r a -> (a -> a) -> m ()
modify T r a
f a -> a
g
T r a -> m a
forall r (m :: * -> *) a. MonadState r m => T r a -> m a
get T r a
f
infix 1 %=, %:
(%=) :: MonadState r m => Accessor.T r a -> a -> m ()
%= :: T r a -> a -> m ()
(%=) = T r a -> a -> m ()
forall r (m :: * -> *) a. MonadState r m => T r a -> a -> m ()
set
(%:) :: MonadState r m => Accessor.T r a -> (a -> a) -> m ()
%: :: T r a -> (a -> a) -> m ()
(%:) = T r a -> (a -> a) -> m ()
forall r (m :: * -> *) a.
MonadState r m =>
T r a -> (a -> a) -> m ()
modify
lift :: (MonadState r mr) =>
Accessor.T r s -> State s a -> mr a
lift :: T r s -> State s a -> mr a
lift f :: T r s
f m :: State s a
m =
do s
s0 <- T r s -> mr s
forall r (m :: * -> *) a. MonadState r m => T r a -> m a
get T r s
f
let (a :: a
a,s1 :: s
s1) = State s a -> s -> (a, s)
forall s a. State s a -> s -> (a, s)
runState State s a
m s
s0
T r s -> s -> mr ()
forall r (m :: * -> *) a. MonadState r m => T r a -> a -> m ()
set T r s
f s
s1
a -> mr a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
liftT :: (Monad m, MonadTrans t, MonadState r (t m)) =>
Accessor.T r s -> StateT s m a -> t m a
liftT :: T r s -> StateT s m a -> t m a
liftT f :: T r s
f m :: StateT s m a
m =
do s
s0 <- T r s -> t m s
forall r (m :: * -> *) a. MonadState r m => T r a -> m a
get T r s
f
(a :: a
a,s1 :: s
s1) <- m (a, s) -> t m (a, s)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
Trans.lift (m (a, s) -> t m (a, s)) -> m (a, s) -> t m (a, s)
forall a b. (a -> b) -> a -> b
$ StateT s m a -> s -> m (a, s)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
s0
T r s -> s -> t m ()
forall r (m :: * -> *) a. MonadState r m => T r a -> a -> m ()
set T r s
f s
s1
a -> t m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a