module SPmonad where
import SP(SP)
import ParSP(seqSP)
import Spops
import StateMonads(Mk(..),toMkc) --,bmk,toMs

type SPm i o ans = Mk (SP i o) ans

putsSPm :: [o] -> SPm i o ()
putsSPm :: [o] -> SPm i o ()
putsSPm = (SP i o -> SP i o) -> SPm i o ()
forall k. (k -> k) -> Mkc k
toMkc ((SP i o -> SP i o) -> SPm i o ())
-> ([o] -> SP i o -> SP i o) -> [o] -> SPm i o ()
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

putSPm :: o -> SPm i o ()
putSPm :: o -> SPm i o ()
putSPm = (SP i o -> SP i o) -> SPm i o ()
forall k. (k -> k) -> Mkc k
toMkc ((SP i o -> SP i o) -> SPm i o ())
-> (o -> SP i o -> SP i o) -> o -> SPm i o ()
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

getSPm :: SPm i o i
getSPm :: SPm i o i
getSPm = Cont (SP i o) i -> SPm i o i
forall k r. Cont k r -> Mk k r
Mk Cont (SP i o) i
forall a b. Cont (SP a b) a
getSP

nullSPm :: SPm i o ()
nullSPm :: SPm i o ()
nullSPm = () -> SPm i o ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

monadSP :: (SPm i o ()) -> SP i o
monadSP :: SPm i o () -> SP i o
monadSP (Mk Cont (SP i o) ()
spm) = Cont (SP i o) ()
spm (SP i o -> () -> SP i o
forall a b. a -> b -> a
const SP i o
forall a b. SP a b
nullSP)

toSPm :: (SP i o) -> SPm i o ()
toSPm :: SP i o -> SPm i o ()
toSPm SP i o
sp = (SP i o -> SP i o) -> SPm i o ()
forall k. (k -> k) -> Mkc k
toMkc (SP i o -> SP i o -> SP i o
forall a b. SP a b -> SP a b -> SP a b
seqSP SP i o
sp)