module State (State, comb, comb_, ret) where

type State s a = s -> (a, s)

comb :: State s a -> (a -> State s b) -> State s b
comb m n = \s0 -> let (x1, s1) = m s0
                      (x2, s2) = n x1 s1
                  in  (x2, s2)

comb_ :: State s a -> State s b -> State s b
comb_ m n = m `comb` \_ -> n

ret :: a -> State s a
ret x = \s -> (x, s)