module StateM (module StateM) where newtype StateM s a = St { unSt :: s -> (a,s) } updSt :: (s -> s) -> StateM s s getSt :: StateM s s setSt :: s -> StateM s s runSt :: s -> StateM s a -> a runStS :: s -> StateM s a -> (a,s) instance Monad (StateM s) where return x = St $ \s -> (x,s) St f >>= g = St $ \s -> let (x,t) = f s in unSt (g x) t instance Functor (StateM s) where fmap f = (>>= return . f) updSt f = St $ \s -> (s, f s) getSt = updSt id setSt = updSt . const runSt s = fst . runStS s runStS s = ($ s) . unSt