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)