module Spops(module Spops,Cont(..)) where import SP import EitherUtils(Cont(..)) {- INLINE nullSP -} nullSP :: SP a b nullSP = NullSP putsSP :: [b] -> SP a b -> SP a b putsSP [] sp = sp putsSP (x : xs) sp = PutSP x (putsSP xs sp) {- INLINE putSP -} putSP :: b -> SP a b -> SP a b putSP = PutSP appendStartSP :: [b] -> SP a b -> SP a b appendStartSP zs (PutSP y sp) = PutSP y (putsSP zs sp) appendStartSP zs sp = putsSP zs sp stepSP :: [b] -> Cont (SP a b) a stepSP ys xsp = putsSP ys (GetSP xsp) getSP :: Cont (SP a b) a getSP = GetSP walkSP sp x = case sp of PutSP y sp' -> let (ys, sp'') = walkSP sp' x in (y : ys, sp'') GetSP xsp' -> pullSP (xsp' x) NullSP -> ([], NullSP) pullSP sp = case sp of PutSP y sp' -> let (ys, sp'') = pullSP sp' in (y : ys, sp'') _ -> ([], sp) runSP sp xs = case sp of PutSP y sp' -> y : runSP sp' xs GetSP xsp -> case xs of x : xs' -> runSP (xsp x) xs' [] -> [] NullSP -> [] feedSP :: a -> [a] -> SP a b -> SP a b feedSP x xs sp = case sp of PutSP y sp' -> PutSP y (feedSP x xs sp') GetSP xsp' -> startupSP xs (xsp' x) NullSP -> NullSP startupSP :: [a] -> SP a b -> SP a b startupSP [] sp = sp startupSP (x : xs) sp = feedSP x xs sp delaySP sp = GetSP (\x -> startupSP [x] sp) mapSP f = m where m = GetSP (\x -> PutSP (f x) m) idSP = GetSP (\x -> PutSP x idSP) --and concatMapSP :: (*a->[*b]) -> SP *a *b concatMapSP f = m where m = GetSP (\x -> putsSP (f x) m) concmapSP = concatMapSP concatMapAccumlSP f s0 = GetSP (\x -> let (s, y) = f s0 x in putsSP y (concatMapAccumlSP f s)) mapstateSP = concatMapAccumlSP mapAccumlSP f s0 = GetSP (\x -> let (s, y) = f s0 x in PutSP y (mapAccumlSP f s)) concatSP = GetSP (\xs -> putsSP xs concatSP) concSP = concatSP zipSP (x : xs) = getSP (\y -> putSP (x, y) (zipSP xs)) zipSP [] = nullSP filterSP p = getSP (\x -> (if p x then putSP x else id) (filterSP p)) splitAtElemSP :: (a -> Bool) -> Cont (SP a b) [a] splitAtElemSP p xsp = let lSP acc = getSP (\x -> if p x then xsp (reverse acc) else lSP (x : acc)) in lSP [] chopSP splitSP' = splitSP' (\xs -> putSP xs (chopSP splitSP'))