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

Copyright(c) 2011 Brent Yorgey
LicenseBSD-style (see LICENSE)
Maintainerbyorgey@cis.upenn.edu
Safe HaskellNone
LanguageHaskell2010

Control.Monad.StateStack

Contents

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 MonadState s m => MonadStateStack s m where

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

Methods

save

Arguments

:: m ()

Save the current state on the stack

restore

Arguments

:: m ()

Restore the top state from the stack

The StateStackT transformer

newtype StateStackT s m a

A monad transformer which adds a save/restorable state to an existing monad.

Constructors

StateStackT 

Fields

unStateStackT :: StateT (s, [s]) m a
 

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.