module UIxStateM (HasState(..), StateM, withSt, withStS, mapState) where
import MT
import Control_Monad_Fix
newtype StateM s a = S (s -> (# a,s #))
withSt :: s -> StateM s a -> a
withSt s (S m) = case m s of (# a,s #) -> a
withStS :: s -> StateM s a -> (a,s)
withStS s (S m) = case m s of (# a,s #) -> (a,s)
mapState :: (t -> s) -> (s -> t) -> StateM s a -> StateM t a
mapState inF outF (S m) = S
(\t -> case m (inF t) of (# a,s1 #) -> (# a, outF s1 #) )
instance Functor (StateM s) where
fmap f m = m >>= return . f
instance Monad (StateM s) where
return x = S (\s -> (# x,s #) )
S f >>= g = S (\s -> case f s of (# x,s1 #) ->
case g x of S m1 -> m1 s1)
instance HasState (StateM s) Z s where
updSt _ f = S (\s -> (# s , f s #))
updSt_ _ f = S (\s -> (# (), f s #))
getSt _ = S (\s -> (# s , s #))
setSt _ s = S (\t -> (# t , s #))
setSt_ _ s = S (\_ -> (# (), s #))
instance MonadFix (StateM s) where
mfix f = S (\s -> let S m = f a
(a,s1) = case m s of (# a,s1 #) -> (a,s1)
in (# a,s1 #))
instance HasBaseMonad (StateM s) (StateM s) where
inBase = id
{- tests
foldSt :: (a -> s -> s) -> [a] -> StateM s s
foldSt f [] = getSt this
foldSt f (x:xs) = updSt_ this (f x) >> foldSt f xs
-}