module SPstateMonad where import SP(SP) import Spops import StateMonads(Mk(..),Ms(..),toMs,toMsc,loadMs,storeMs) type SPms i o s ans = Ms (SP i o) s ans putsSPms :: [o] -> SPms i o s () putSPms :: o -> SPms i o s () getSPms :: SPms i o s i nullSPms :: SPms i o s () loadSPms :: SPms i o s s storeSPms :: s -> SPms i o s () stateMonadSP :: s -> SPms i o s ans -> (ans -> SP i o) -> SP i o putsSPms :: [o] -> SPms i o s () putsSPms = (SP i o -> SP i o) -> SPms i o s () forall k r. (k -> k) -> Msc k r toMsc ((SP i o -> SP i o) -> SPms i o s ()) -> ([o] -> SP i o -> SP i o) -> [o] -> SPms i o s () forall b c a. (b -> c) -> (a -> b) -> a -> c . [o] -> SP i o -> SP i o forall b a. [b] -> SP a b -> SP a b putsSP putSPms :: o -> SPms i o s () putSPms = (SP i o -> SP i o) -> SPms i o s () forall k r. (k -> k) -> Msc k r toMsc ((SP i o -> SP i o) -> SPms i o s ()) -> (o -> SP i o -> SP i o) -> o -> SPms i o s () forall b c a. (b -> c) -> (a -> b) -> a -> c . o -> SP i o -> SP i o forall b a. b -> SP a b -> SP a b putSP getSPms :: SPms i o s i getSPms = Cont (SP i o) i -> SPms i o s i forall k r s. Cont k r -> Ms k s r toMs Cont (SP i o) i forall a b. Cont (SP a b) a getSP nullSPms :: SPms i o s () nullSPms = () -> SPms i o s () forall (m :: * -> *) a. Monad m => a -> m a return () loadSPms :: SPms i o s s loadSPms = SPms i o s s forall k s. Ms k s s loadMs storeSPms :: s -> SPms i o s () storeSPms = s -> SPms i o s () forall s k. s -> Msc k s storeMs stateMonadSP :: s -> SPms i o s ans -> (ans -> SP i o) -> SP i o stateMonadSP s s0 (Mk Cont (s -> SP i o) ans spm) ans -> SP i o sp = Cont (s -> SP i o) ans spm (\ans ans s state->ans -> SP i o sp ans ans) s s0