1 module State (State, returnS, eachS, thenS, putS, getS, useS) where
    2 
    3 data  State s x       =   Abs (s -> (x, s))
    4 rep                   ::  State s x -> (s -> (x,s))
    5 rep (Abs f)           =   f
    6 returnS               ::  x -> State s x
    7 returnS x             =   Abs (\s -> (x, s))
    8 eachS                 ::  State s x -> (x -> y) -> State s y
    9 xS `eachS` f          =   Abs (\s -> let (x,s') = rep xS s in (f x, s'))
   10 thenS                 ::  State s x -> (x -> State s y) -> State s y
   11 xS `thenS` kS         =   Abs (\s -> let (x,s') = rep xS s in rep (kS x) s')
   12 putS                  ::  s -> State s ()
   13 putS s'               =   Abs (\s -> ((), s'))
   14 getS                  ::  State s s
   15 getS                  =   Abs (\s -> (s,s))
   16 useS                  ::  State s x -> s -> x
   17 useS xS s             =   let (x,s') = rep xS s in  x