-- | Internal functions not necessary to be exported.

module Descriptive.Internal where

import Control.Monad.State.Strict

-- | Run a different state in this state monad.
runSubStateT :: Monad m
             => (s -> s') -> (s' -> s) -> StateT s' m a -> StateT s m a
runSubStateT :: (s -> s') -> (s' -> s) -> StateT s' m a -> StateT s m a
runSubStateT to :: s -> s'
to from :: s' -> s
from m :: StateT s' m a
m =
  (s -> m (a, s)) -> StateT s m a
forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT (\s :: s
s ->
            ((a, s') -> (a, s)) -> m (a, s') -> m (a, s)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (\(a :: a
a,s' :: s'
s') -> (a
a,s' -> s
from s'
s'))
                  (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 -> s'
to s
s)))