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)