statestack-0.2.0.5: Simple State-like monad transformer with saveable and restorable state

Description

A state monad which allows the state to be saved and restored on a stack.

Computation type:
Computations with implicit access to a read/write state, with additional operations for pushing the current state on a stack and later restoring the state from the top of the stack.
Binding strategy:
Same as for the usual state monad; the state and accompanying stack of saved states are threaded through computations.
Useful for:
Remembering state while emitting commands for some system which itself has saveable/restorable state, such as OpenGL or Cairo.

Simple example:

ghci> let p = get >>= liftIO . print
ghci> evalStateStackT (put 2 >> p >> save >> put 3 >> p >> restore >> p) 0
2
3
2
Synopsis

# The MonadStateStack class

Class of monads which support a state along with a stack for saving and restoring states.

Methods

Arguments

 :: m () Save the current state on the stack

Arguments

 :: m () Restore the top state from the stack
Instances

# The StateStackT transformer

newtype StateStackT s m a #

Constructors

 StateStackT FieldsunStateStackT :: StateT (s, [s]) m a
Instances

# Running StateStackT and StateStack computations

runStateStackT :: Monad m => StateStackT s m a -> s -> m (a, s) #

Run a StateStackT computation from an initial state, resulting in a computation of the underlying monad which yields the return value and final state.

evalStateStackT :: Monad m => StateStackT s m a -> s -> m a #

Like runStateStackT, but discard the final state.

execStateStackT :: Monad m => StateStackT s m a -> s -> m s #

Like runStateStackT, but discard the return value and yield only the final state.

runStateStack :: StateStack s a -> s -> (a, s) #

Run a StateStack computation from an initial state, resulting in a pair of the final return value and final state.

evalStateStack :: StateStack s a -> s -> a #

Like runStateStack, but discard the final state.

execStateStack :: StateStack s a -> s -> s #

Like runStateStack, but discard the return value and yield only the final state.

liftState :: Monad m => StateT s m a -> StateStackT s m a #

StateT computations can always be lifted to StateStackT computations which do not manipulate the state stack.