module StateX (StateX, returnSX, eachSX, thenSX, toSX, putSX, getSX, useSX) where data StateX s a = MkSX (s -> a) rep (MkSX f) = f returnSX returnX x = MkSX (\s -> returnX (x, s)) eachSX eachX xSX f = MkSX (\s -> rep xSX s `eachX` (\(x,s') -> (f x, s'))) thenSX thenX xSX kSX = MkSX (\s -> rep xSX s `thenX` (\(x,s') -> rep (kSX x) s')) toSX eachX xX = MkSX (\s -> xX `eachX` (\x -> (x,s))) putSX returnX s' = MkSX (\s -> returnX ((), s')) getSX returnX = MkSX (\s -> returnX (s,s)) useSX eachX s xSX = rep xSX s `eachX` (\(x,s') -> x)