module IxStateM (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 m = fst (m $$ s)
withStS :: s -> StateM s a -> (a,s)
withStS s m = m $$ s
mapState :: (t -> s) -> (s -> t) -> StateM s a -> StateM t a
mapState inF outF m = S (\s -> let (a,s1) = m $$ inF s in (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) )
f >>= g = S (\s -> let (x,s1) = f $$ s in g x $$ 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