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