module Control.Monad.MonadStateIO
( module Control.Monad.MonadStateIO
)
where
import System.IO
newtype StateIO state res = STIO { trans :: state -> IO (res, state) }
instance Monad (StateIO state) where
return v
= STIO ( \s -> return (v, s))
STIO cmd >>= f
= STIO ( \s ->
cmd s >>= \ (rl, s') ->
(trans . f) rl s'
)
io :: IO a -> StateIO state a
io iocmd
= STIO ( \s ->
do
a <- iocmd
return (a, s)
)
trcState :: (state -> String) -> StateIO state ()
trcState fct
= STIO ( \s ->
do
hPutStr stderr $ fct s
return ((), s)
)
changeState :: (state -> state) -> StateIO state state
changeState f
= STIO ( \s ->
let s' = f s
in
return (s', s')
)
setState :: state -> StateIO state state
setState s
= changeState ( \_ -> s )
getState :: StateIO state state
getState
= changeState id
run :: state -> StateIO state res -> IO res
run initialState (STIO cmd)
= do
(res, _finalState) <- cmd initialState
return res