The mstate package

MState offers a State monad which can be used in concurrent
applications. It also manages new threads and waits until the
whole state monad has been evaluated/executed before it returns
the state values (if desired).