1 module StateX (StateX, returnSX, eachSX, thenSX, toSX, putSX, getSX, useSX) where
    2 
    3 data  StateX s a      =   MkSX (s -> a)
    4 rep (MkSX f)          =   f
    5 returnSX returnX x    =   MkSX (\s -> returnX (x, s))
    6 eachSX eachX xSX f    =   MkSX (\s -> rep xSX s `eachX` (\(x,s') -> (f x, s')))
    7 thenSX thenX xSX kSX  =   MkSX (\s -> rep xSX s `thenX` (\(x,s') -> rep (kSX x) s'))
    8 toSX eachX xX         =   MkSX (\s -> xX `eachX` (\x -> (x,s)))
    9 putSX returnX s'      =   MkSX (\s -> returnX ((), s'))
   10 getSX returnX         =   MkSX (\s -> returnX (s,s))
   11 useSX eachX s xSX     =   rep xSX s `eachX` (\(x,s') -> x)