module Streamly.Internal.Data.Stream.StreamD.Nesting
(
AppendState(..)
, append
, InterleaveState(..)
, interleave
, interleaveMin
, interleaveSuffix
, interleaveInfix
, roundRobin
, zipWith
, zipWithM
, mergeBy
, mergeByM
, concatMap
, concatMapM
, unfoldMany
, ConcatUnfoldInterleaveState (..)
, unfoldManyInterleave
, unfoldManyRoundRobin
, interpose
, interposeSuffix
, gintercalate
, gintercalateSuffix
, foldMany
, refoldMany
, foldIterateM
, refoldIterateM
, parseMany
, parseIterate
, chunksOf
, groupsBy
, groupsRollingBy
, wordsBy
, splitOnSeq
, splitOnSuffixSeq
, sliceOnSuffix
, splitInnerBy
, splitInnerBySuffix
, intersectBySorted
)
where
#include "inline.hs"
#include "ArrayMacros.h"
import Control.Exception (assert)
import Control.Monad.Catch (MonadThrow, throwM)
import Control.Monad.IO.Class (MonadIO(..))
import Data.Bits (shiftR, shiftL, (.|.), (.&.))
#if __GLASGOW_HASKELL__ >= 801
import Data.Functor.Identity ( Identity )
#endif
import Data.Word (Word32)
import Foreign.Storable (Storable(..))
import Fusion.Plugin.Types (Fuse(..))
import GHC.Types (SPEC(..))
import Streamly.Internal.Data.Array.Foreign.Type (Array(..))
import Streamly.Internal.Data.Fold.Step (Step(..))
import Streamly.Internal.Data.Fold.Type (Fold(..))
import Streamly.Internal.Data.Parser (ParseError(..))
import Streamly.Internal.Data.Refold.Type (Refold(..))
import Streamly.Internal.Data.SVar.Type (adaptState)
import Streamly.Internal.Data.Tuple.Strict (Tuple'(..))
import Streamly.Internal.Data.Unfold.Type (Unfold(..))
import qualified Streamly.Internal.Data.Array.Foreign.Type as A
import qualified Streamly.Internal.Data.Fold as FL
import qualified Streamly.Internal.Data.Parser as PR
import qualified Streamly.Internal.Data.Parser.ParserD as PRD
import qualified Streamly.Internal.Data.Ring.Foreign as RB
import Streamly.Internal.Data.Stream.StreamD.Type
import Prelude hiding (concatMap, mapM, zipWith)
data AppendState s1 s2 = AppendFirst s1 | AppendSecond s2
{-# INLINE_NORMAL append #-}
append :: Monad m => Stream m a -> Stream m a -> Stream m a
append :: forall (m :: * -> *) a.
Monad m =>
Stream m a -> Stream m a -> Stream m a
append (Stream State Stream m a -> s -> m (Step s a)
step1 s
state1) (Stream State Stream m a -> s -> m (Step s a)
step2 s
state2) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m a -> AppendState s s -> m (Step (AppendState s s) a)
step (forall s1 s2. s1 -> AppendState s1 s2
AppendFirst s
state1)
where
{-# INLINE_LATE step #-}
step :: State Stream m a -> AppendState s s -> m (Step (AppendState s s) a)
step State Stream m a
gst (AppendFirst s
st) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> AppendState s1 s2
AppendFirst s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> AppendState s1 s2
AppendFirst s
s)
Step s a
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2. s2 -> AppendState s1 s2
AppendSecond s
state2)
step State Stream m a
gst (AppendSecond s
st) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step2 State Stream m a
gst s
st
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s2 -> AppendState s1 s2
AppendSecond s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s2 -> AppendState s1 s2
AppendSecond s
s)
Step s a
Stop -> forall s a. Step s a
Stop
data InterleaveState s1 s2 = InterleaveFirst s1 s2 | InterleaveSecond s1 s2
| InterleaveSecondOnly s2 | InterleaveFirstOnly s1
{-# INLINE_NORMAL interleave #-}
interleave :: Monad m => Stream m a -> Stream m a -> Stream m a
interleave :: forall (m :: * -> *) a.
Monad m =>
Stream m a -> Stream m a -> Stream m a
interleave (Stream State Stream m a -> s -> m (Step s a)
step1 s
state1) (Stream State Stream m a -> s -> m (Step s a)
step2 s
state2) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m a
-> InterleaveState s s -> m (Step (InterleaveState s s) a)
step (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
state1 s
state2)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> InterleaveState s s -> m (Step (InterleaveState s s) a)
step State Stream m a
gst (InterleaveFirst s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveSecond s
s s
st2)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
s s
st2)
Step s a
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2. s2 -> InterleaveState s1 s2
InterleaveSecondOnly s
st2)
step State Stream m a
gst (InterleaveSecond s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step2 State Stream m a
gst s
st2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
st1 s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveSecond s
st1 s
s)
Step s a
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
st1)
step State Stream m a
gst (InterleaveFirstOnly s
st1) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
s)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
gst (InterleaveSecondOnly s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step2 State Stream m a
gst s
st2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s2 -> InterleaveState s1 s2
InterleaveSecondOnly s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s2 -> InterleaveState s1 s2
InterleaveSecondOnly s
s)
Step s a
Stop -> forall s a. Step s a
Stop
{-# INLINE_NORMAL interleaveMin #-}
interleaveMin :: Monad m => Stream m a -> Stream m a -> Stream m a
interleaveMin :: forall (m :: * -> *) a.
Monad m =>
Stream m a -> Stream m a -> Stream m a
interleaveMin (Stream State Stream m a -> s -> m (Step s a)
step1 s
state1) (Stream State Stream m a -> s -> m (Step s a)
step2 s
state2) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m a
-> InterleaveState s s -> m (Step (InterleaveState s s) a)
step (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
state1 s
state2)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> InterleaveState s s -> m (Step (InterleaveState s s) a)
step State Stream m a
gst (InterleaveFirst s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveSecond s
s s
st2)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
s s
st2)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
gst (InterleaveSecond s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step2 State Stream m a
gst s
st2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
st1 s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveSecond s
st1 s
s)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
_ (InterleaveFirstOnly s
_) = forall a. HasCallStack => a
undefined
step State Stream m a
_ (InterleaveSecondOnly s
_) = forall a. HasCallStack => a
undefined
{-# INLINE_NORMAL interleaveSuffix #-}
interleaveSuffix :: Monad m => Stream m a -> Stream m a -> Stream m a
interleaveSuffix :: forall (m :: * -> *) a.
Monad m =>
Stream m a -> Stream m a -> Stream m a
interleaveSuffix (Stream State Stream m a -> s -> m (Step s a)
step1 s
state1) (Stream State Stream m a -> s -> m (Step s a)
step2 s
state2) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m a
-> InterleaveState s s -> m (Step (InterleaveState s s) a)
step (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
state1 s
state2)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> InterleaveState s s -> m (Step (InterleaveState s s) a)
step State Stream m a
gst (InterleaveFirst s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveSecond s
s s
st2)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
s s
st2)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
gst (InterleaveSecond s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step2 State Stream m a
gst s
st2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
st1 s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveSecond s
st1 s
s)
Step s a
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
st1)
step State Stream m a
gst (InterleaveFirstOnly s
st1) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
s)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
_ (InterleaveSecondOnly s
_) = forall a. HasCallStack => a
undefined
data InterleaveInfixState s1 s2 a
= InterleaveInfixFirst s1 s2
| InterleaveInfixSecondBuf s1 s2
| InterleaveInfixSecondYield s1 s2 a
| InterleaveInfixFirstYield s1 s2 a
| InterleaveInfixFirstOnly s1
{-# INLINE_NORMAL interleaveInfix #-}
interleaveInfix :: Monad m => Stream m a -> Stream m a -> Stream m a
interleaveInfix :: forall (m :: * -> *) a.
Monad m =>
Stream m a -> Stream m a -> Stream m a
interleaveInfix (Stream State Stream m a -> s -> m (Step s a)
step1 s
state1) (Stream State Stream m a -> s -> m (Step s a)
step2 s
state2) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m a
-> InterleaveInfixState s s a
-> m (Step (InterleaveInfixState s s a) a)
step (forall s1 s2 a. s1 -> s2 -> InterleaveInfixState s1 s2 a
InterleaveInfixFirst s
state1 s
state2)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> InterleaveInfixState s s a
-> m (Step (InterleaveInfixState s s a) a)
step State Stream m a
gst (InterleaveInfixFirst s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2 a. s1 -> s2 -> InterleaveInfixState s1 s2 a
InterleaveInfixSecondBuf s
s s
st2)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2 a. s1 -> s2 -> InterleaveInfixState s1 s2 a
InterleaveInfixFirst s
s s
st2)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
gst (InterleaveInfixSecondBuf s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step2 State Stream m a
gst s
st2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. s -> Step s a
Skip (forall s1 s2 a. s1 -> s2 -> a -> InterleaveInfixState s1 s2 a
InterleaveInfixSecondYield s
st1 s
s a
a)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2 a. s1 -> s2 -> InterleaveInfixState s1 s2 a
InterleaveInfixSecondBuf s
st1 s
s)
Step s a
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2 a. s1 -> InterleaveInfixState s1 s2 a
InterleaveInfixFirstOnly s
st1)
step State Stream m a
gst (InterleaveInfixSecondYield s
st1 s
st2 a
x) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
x (forall s1 s2 a. s1 -> s2 -> a -> InterleaveInfixState s1 s2 a
InterleaveInfixFirstYield s
s s
st2 a
a)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2 a. s1 -> s2 -> a -> InterleaveInfixState s1 s2 a
InterleaveInfixSecondYield s
s s
st2 a
x)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
_ (InterleaveInfixFirstYield s
st1 s
st2 a
x) = do
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield a
x (forall s1 s2 a. s1 -> s2 -> InterleaveInfixState s1 s2 a
InterleaveInfixSecondBuf s
st1 s
st2)
step State Stream m a
gst (InterleaveInfixFirstOnly s
st1) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2 a. s1 -> InterleaveInfixState s1 s2 a
InterleaveInfixFirstOnly s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2 a. s1 -> InterleaveInfixState s1 s2 a
InterleaveInfixFirstOnly s
s)
Step s a
Stop -> forall s a. Step s a
Stop
{-# INLINE_NORMAL roundRobin #-}
roundRobin :: Monad m => Stream m a -> Stream m a -> Stream m a
roundRobin :: forall (m :: * -> *) a.
Monad m =>
Stream m a -> Stream m a -> Stream m a
roundRobin (Stream State Stream m a -> s -> m (Step s a)
step1 s
state1) (Stream State Stream m a -> s -> m (Step s a)
step2 s
state2) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m a
-> InterleaveState s s -> m (Step (InterleaveState s s) a)
step (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
state1 s
state2)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> InterleaveState s s -> m (Step (InterleaveState s s) a)
step State Stream m a
gst (InterleaveFirst s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveSecond s
s s
st2)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveSecond s
s s
st2)
Step s a
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2. s2 -> InterleaveState s1 s2
InterleaveSecondOnly s
st2)
step State Stream m a
gst (InterleaveSecond s
st1 s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step2 State Stream m a
gst s
st2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
st1 s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> s2 -> InterleaveState s1 s2
InterleaveFirst s
st1 s
s)
Step s a
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
st1)
step State Stream m a
gst (InterleaveSecondOnly s
st2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step2 State Stream m a
gst s
st2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s2 -> InterleaveState s1 s2
InterleaveSecondOnly s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s2 -> InterleaveState s1 s2
InterleaveSecondOnly s
s)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
gst (InterleaveFirstOnly s
st1) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 State Stream m a
gst s
st1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
s -> forall s a. a -> s -> Step s a
Yield a
a (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
s)
Skip s
s -> forall s a. s -> Step s a
Skip (forall s1 s2. s1 -> InterleaveState s1 s2
InterleaveFirstOnly s
s)
Step s a
Stop -> forall s a. Step s a
Stop
{-# INLINE_NORMAL zipWithM #-}
zipWithM :: Monad m
=> (a -> b -> m c) -> Stream m a -> Stream m b -> Stream m c
zipWithM :: forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> Stream m a -> Stream m b -> Stream m c
zipWithM a -> b -> m c
f (Stream State Stream m a -> s -> m (Step s a)
stepa s
ta) (Stream State Stream m b -> s -> m (Step s b)
stepb s
tb) = forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a -> (s, s, Maybe a) -> m (Step (s, s, Maybe a) c)
step (s
ta, s
tb, forall a. Maybe a
Nothing)
where
{-# INLINE_LATE step #-}
step :: State Stream m a -> (s, s, Maybe a) -> m (Step (s, s, Maybe a) c)
step State Stream m a
gst (s
sa, s
sb, Maybe a
Nothing) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
stepa (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
sa
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$
case Step s a
r of
Yield a
x s
sa' -> forall s a. s -> Step s a
Skip (s
sa', s
sb, forall a. a -> Maybe a
Just a
x)
Skip s
sa' -> forall s a. s -> Step s a
Skip (s
sa', s
sb, forall a. Maybe a
Nothing)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
gst (s
sa, s
sb, Just a
x) = do
Step s b
r <- State Stream m b -> s -> m (Step s b)
stepb (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
sb
case Step s b
r of
Yield b
y s
sb' -> do
c
z <- a -> b -> m c
f a
x b
y
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield c
z (s
sa, s
sb', forall a. Maybe a
Nothing)
Skip s
sb' -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (s
sa, s
sb', forall a. a -> Maybe a
Just a
x)
Step s b
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
#if __GLASGOW_HASKELL__ >= 801
{-# RULES "zipWithM xs xs"
forall f xs. zipWithM @Identity f xs xs = mapM (\x -> f x x) xs #-}
#endif
{-# INLINE zipWith #-}
zipWith :: Monad m => (a -> b -> c) -> Stream m a -> Stream m b -> Stream m c
zipWith :: forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> Stream m a -> Stream m b -> Stream m c
zipWith a -> b -> c
f = forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> Stream m a -> Stream m b -> Stream m c
zipWithM (\a
a b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return (a -> b -> c
f a
a b
b))
{-# INLINE_NORMAL mergeByM #-}
mergeByM
:: (Monad m)
=> (a -> a -> m Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeByM :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> m Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeByM a -> a -> m Ordering
cmp (Stream State Stream m a -> s -> m (Step s a)
stepa s
ta) (Stream State Stream m a -> s -> m (Step s a)
stepb s
tb) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m a
-> (Maybe s, Maybe s, Maybe a, Maybe a)
-> m (Step (Maybe s, Maybe s, Maybe a, Maybe a) a)
step (forall a. a -> Maybe a
Just s
ta, forall a. a -> Maybe a
Just s
tb, forall a. Maybe a
Nothing, forall a. Maybe a
Nothing)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> (Maybe s, Maybe s, Maybe a, Maybe a)
-> m (Step (Maybe s, Maybe s, Maybe a, Maybe a) a)
step State Stream m a
gst (Just s
sa, Maybe s
sb, Maybe a
Nothing, Maybe a
b) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
stepa State Stream m a
gst s
sa
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
sa' -> forall s a. s -> Step s a
Skip (forall a. a -> Maybe a
Just s
sa', Maybe s
sb, forall a. a -> Maybe a
Just a
a, Maybe a
b)
Skip s
sa' -> forall s a. s -> Step s a
Skip (forall a. a -> Maybe a
Just s
sa', Maybe s
sb, forall a. Maybe a
Nothing, Maybe a
b)
Step s a
Stop -> forall s a. s -> Step s a
Skip (forall a. Maybe a
Nothing, Maybe s
sb, forall a. Maybe a
Nothing, Maybe a
b)
step State Stream m a
gst (Maybe s
sa, Just s
sb, Maybe a
a, Maybe a
Nothing) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
stepb State Stream m a
gst s
sb
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
b s
sb' -> forall s a. s -> Step s a
Skip (Maybe s
sa, forall a. a -> Maybe a
Just s
sb', Maybe a
a, forall a. a -> Maybe a
Just a
b)
Skip s
sb' -> forall s a. s -> Step s a
Skip (Maybe s
sa, forall a. a -> Maybe a
Just s
sb', Maybe a
a, forall a. Maybe a
Nothing)
Step s a
Stop -> forall s a. s -> Step s a
Skip (Maybe s
sa, forall a. Maybe a
Nothing, Maybe a
a, forall a. Maybe a
Nothing)
step State Stream m a
_ (Maybe s
sa, Maybe s
sb, Just a
a, Just a
b) = do
Ordering
res <- a -> a -> m Ordering
cmp a
a a
b
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Ordering
res of
Ordering
GT -> forall s a. a -> s -> Step s a
Yield a
b (Maybe s
sa, Maybe s
sb, forall a. a -> Maybe a
Just a
a, forall a. Maybe a
Nothing)
Ordering
_ -> forall s a. a -> s -> Step s a
Yield a
a (Maybe s
sa, Maybe s
sb, forall a. Maybe a
Nothing, forall a. a -> Maybe a
Just a
b)
step State Stream m a
_ (Maybe s
Nothing, Maybe s
sb, Maybe a
Nothing, Just a
b) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield a
b (forall a. Maybe a
Nothing, Maybe s
sb, forall a. Maybe a
Nothing, forall a. Maybe a
Nothing)
step State Stream m a
_ (Maybe s
sa, Maybe s
Nothing, Just a
a, Maybe a
Nothing) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield a
a (Maybe s
sa, forall a. Maybe a
Nothing, forall a. Maybe a
Nothing, forall a. Maybe a
Nothing)
step State Stream m a
_ (Maybe s
Nothing, Maybe s
Nothing, Maybe a
Nothing, Maybe a
Nothing) = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
{-# INLINE mergeBy #-}
mergeBy
:: (Monad m)
=> (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeBy a -> a -> Ordering
cmp = forall (m :: * -> *) a.
Monad m =>
(a -> a -> m Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeByM (\a
a a
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ a -> a -> Ordering
cmp a
a a
b)
{-# INLINE_NORMAL intersectBySorted #-}
intersectBySorted :: Monad m
=> (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
intersectBySorted :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
intersectBySorted a -> a -> Ordering
cmp (Stream State Stream m a -> s -> m (Step s a)
stepa s
ta) (Stream State Stream m a -> s -> m (Step s a)
stepb s
tb) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m a
-> (s, s, Maybe a, Maybe a) -> m (Step (s, s, Maybe a, Maybe a) a)
step
( s
ta
, s
tb
, forall a. Maybe a
Nothing
, forall a. Maybe a
Nothing
)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> (s, s, Maybe a, Maybe a) -> m (Step (s, s, Maybe a, Maybe a) a)
step State Stream m a
gst (s
sa, s
sb, Maybe a
Nothing, Maybe a
b) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
stepa State Stream m a
gst s
sa
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
a s
sa' -> forall s a. s -> Step s a
Skip (s
sa', s
sb, forall a. a -> Maybe a
Just a
a, Maybe a
b)
Skip s
sa' -> forall s a. s -> Step s a
Skip (s
sa', s
sb, forall a. Maybe a
Nothing, Maybe a
b)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
gst (s
sa, s
sb, a :: Maybe a
a@(Just a
_), Maybe a
Nothing) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
stepb State Stream m a
gst s
sb
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s a
r of
Yield a
b s
sb' -> forall s a. s -> Step s a
Skip (s
sa, s
sb', Maybe a
a, forall a. a -> Maybe a
Just a
b)
Skip s
sb' -> forall s a. s -> Step s a
Skip (s
sa, s
sb', Maybe a
a, forall a. Maybe a
Nothing)
Step s a
Stop -> forall s a. Step s a
Stop
step State Stream m a
_ (s
sa, s
sb, Just a
a, Just a
b) = do
let res :: Ordering
res = a -> a -> Ordering
cmp a
a a
b
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Ordering
res of
Ordering
GT -> forall s a. s -> Step s a
Skip (s
sa, s
sb, forall a. a -> Maybe a
Just a
a, forall a. Maybe a
Nothing)
Ordering
LT -> forall s a. s -> Step s a
Skip (s
sa, s
sb, forall a. Maybe a
Nothing, forall a. a -> Maybe a
Just a
b)
Ordering
EQ -> forall s a. a -> s -> Step s a
Yield a
a (s
sa, s
sb, forall a. Maybe a
Nothing, forall a. a -> Maybe a
Just a
b)
data ConcatUnfoldInterleaveState o i =
ConcatUnfoldInterleaveOuter o [i]
| ConcatUnfoldInterleaveInner o [i]
| ConcatUnfoldInterleaveInnerL [i] [i]
| ConcatUnfoldInterleaveInnerR [i] [i]
{-# INLINE_NORMAL unfoldManyInterleave #-}
unfoldManyInterleave :: Monad m => Unfold m a b -> Stream m a -> Stream m b
unfoldManyInterleave :: forall (m :: * -> *) a b.
Monad m =>
Unfold m a b -> Stream m a -> Stream m b
unfoldManyInterleave (Unfold s -> m (Step s b)
istep a -> m s
inject) (Stream State Stream m a -> s -> m (Step s a)
ostep s
ost) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> ConcatUnfoldInterleaveState s s
-> m (Step (ConcatUnfoldInterleaveState s s) b)
step (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
ost [])
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> ConcatUnfoldInterleaveState s s
-> m (Step (ConcatUnfoldInterleaveState s s) b)
step State Stream m a
gst (ConcatUnfoldInterleaveOuter s
o [s]
ls) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
ostep (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
o
case Step s a
r of
Yield a
a s
o' -> do
s
i <- a -> m s
inject a
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInner s
o' (s
i forall a. a -> [a] -> [a]
: [s]
ls)))
Skip s
o' -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
o' [s]
ls)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls [])
step State Stream m a
_ (ConcatUnfoldInterleaveInner s
_ []) = forall a. HasCallStack => a
undefined
step State Stream m a
_ (ConcatUnfoldInterleaveInner s
o (s
st:[s]
ls)) = do
Step s b
r <- s -> m (Step s b)
istep s
st
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s b
r of
Yield b
x s
s -> forall s a. a -> s -> Step s a
Yield b
x (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
o (s
sforall a. a -> [a] -> [a]
:[s]
ls))
Skip s
s -> forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInner s
o (s
sforall a. a -> [a] -> [a]
:[s]
ls))
Step s b
Stop -> forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
o [s]
ls)
step State Stream m a
_ (ConcatUnfoldInterleaveInnerL [] []) = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (ConcatUnfoldInterleaveInnerL [] [s]
rs) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerR [] [s]
rs)
step State Stream m a
_ (ConcatUnfoldInterleaveInnerL (s
st:[s]
ls) [s]
rs) = do
Step s b
r <- s -> m (Step s b)
istep s
st
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s b
r of
Yield b
x s
s -> forall s a. a -> s -> Step s a
Yield b
x (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls (s
sforall a. a -> [a] -> [a]
:[s]
rs))
Skip s
s -> forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL (s
sforall a. a -> [a] -> [a]
:[s]
ls) [s]
rs)
Step s b
Stop -> forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls [s]
rs)
step State Stream m a
_ (ConcatUnfoldInterleaveInnerR [] []) = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (ConcatUnfoldInterleaveInnerR [s]
ls []) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls [])
step State Stream m a
_ (ConcatUnfoldInterleaveInnerR [s]
ls (s
st:[s]
rs)) = do
Step s b
r <- s -> m (Step s b)
istep s
st
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s b
r of
Yield b
x s
s -> forall s a. a -> s -> Step s a
Yield b
x (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerR (s
sforall a. a -> [a] -> [a]
:[s]
ls) [s]
rs)
Skip s
s -> forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerR [s]
ls (s
sforall a. a -> [a] -> [a]
:[s]
rs))
Step s b
Stop -> forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerR [s]
ls [s]
rs)
{-# INLINE_NORMAL unfoldManyRoundRobin #-}
unfoldManyRoundRobin :: Monad m => Unfold m a b -> Stream m a -> Stream m b
unfoldManyRoundRobin :: forall (m :: * -> *) a b.
Monad m =>
Unfold m a b -> Stream m a -> Stream m b
unfoldManyRoundRobin (Unfold s -> m (Step s b)
istep a -> m s
inject) (Stream State Stream m a -> s -> m (Step s a)
ostep s
ost) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> ConcatUnfoldInterleaveState s s
-> m (Step (ConcatUnfoldInterleaveState s s) b)
step (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
ost [])
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> ConcatUnfoldInterleaveState s s
-> m (Step (ConcatUnfoldInterleaveState s s) b)
step State Stream m a
gst (ConcatUnfoldInterleaveOuter s
o [s]
ls) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
ostep (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
o
case Step s a
r of
Yield a
a s
o' -> do
s
i <- a -> m s
inject a
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInner s
o' (s
i forall a. a -> [a] -> [a]
: [s]
ls)))
Skip s
o' -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInner s
o' [s]
ls)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls [])
step State Stream m a
_ (ConcatUnfoldInterleaveInner s
o []) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
o [])
step State Stream m a
_ (ConcatUnfoldInterleaveInner s
o (s
st:[s]
ls)) = do
Step s b
r <- s -> m (Step s b)
istep s
st
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s b
r of
Yield b
x s
s -> forall s a. a -> s -> Step s a
Yield b
x (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
o (s
sforall a. a -> [a] -> [a]
:[s]
ls))
Skip s
s -> forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
o (s
sforall a. a -> [a] -> [a]
:[s]
ls))
Step s b
Stop -> forall s a. s -> Step s a
Skip (forall o i. o -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveOuter s
o [s]
ls)
step State Stream m a
_ (ConcatUnfoldInterleaveInnerL [] []) = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (ConcatUnfoldInterleaveInnerL [] [s]
rs) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerR [] [s]
rs)
step State Stream m a
_ (ConcatUnfoldInterleaveInnerL (s
st:[s]
ls) [s]
rs) = do
Step s b
r <- s -> m (Step s b)
istep s
st
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s b
r of
Yield b
x s
s -> forall s a. a -> s -> Step s a
Yield b
x (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls (s
sforall a. a -> [a] -> [a]
:[s]
rs))
Skip s
s -> forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls (s
sforall a. a -> [a] -> [a]
:[s]
rs))
Step s b
Stop -> forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls [s]
rs)
step State Stream m a
_ (ConcatUnfoldInterleaveInnerR [] []) = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (ConcatUnfoldInterleaveInnerR [s]
ls []) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerL [s]
ls [])
step State Stream m a
_ (ConcatUnfoldInterleaveInnerR [s]
ls (s
st:[s]
rs)) = do
Step s b
r <- s -> m (Step s b)
istep s
st
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s b
r of
Yield b
x s
s -> forall s a. a -> s -> Step s a
Yield b
x (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerR (s
sforall a. a -> [a] -> [a]
:[s]
ls) [s]
rs)
Skip s
s -> forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerR (s
sforall a. a -> [a] -> [a]
:[s]
ls) [s]
rs)
Step s b
Stop -> forall s a. s -> Step s a
Skip (forall o i. [i] -> [i] -> ConcatUnfoldInterleaveState o i
ConcatUnfoldInterleaveInnerR [s]
ls [s]
rs)
{-# ANN type InterposeSuffixState Fuse #-}
data InterposeSuffixState s1 i1 =
InterposeSuffixFirst s1
| InterposeSuffixFirstInner s1 i1
| InterposeSuffixSecond s1
{-# INLINE_NORMAL interposeSuffix #-}
interposeSuffix
:: Monad m
=> m c -> Unfold m b c -> Stream m b -> Stream m c
interposeSuffix :: forall (m :: * -> *) c b.
Monad m =>
m c -> Unfold m b c -> Stream m b -> Stream m c
interposeSuffix
m c
action
(Unfold s -> m (Step s c)
istep1 b -> m s
inject1) (Stream State Stream m b -> s -> m (Step s b)
step1 s
state1) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> InterposeSuffixState s s
-> m (Step (InterposeSuffixState s s) c)
step (forall s1 i1. s1 -> InterposeSuffixState s1 i1
InterposeSuffixFirst s
state1)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> InterposeSuffixState s s
-> m (Step (InterposeSuffixState s s) c)
step State Stream m a
gst (InterposeSuffixFirst s
s1) = do
Step s b
r <- State Stream m b -> s -> m (Step s b)
step1 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s1
case Step s b
r of
Yield b
a s
s -> do
s
i <- b -> m s
inject1 b
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 i1. s1 -> i1 -> InterposeSuffixState s1 i1
InterposeSuffixFirstInner s
s s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 i1. s1 -> InterposeSuffixState s1 i1
InterposeSuffixFirst s
s)
Step s b
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (InterposeSuffixFirstInner s
s1 s
i1) = do
Step s c
r <- s -> m (Step s c)
istep1 s
i1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s c
r of
Yield c
x s
i' -> forall s a. a -> s -> Step s a
Yield c
x (forall s1 i1. s1 -> i1 -> InterposeSuffixState s1 i1
InterposeSuffixFirstInner s
s1 s
i')
Skip s
i' -> forall s a. s -> Step s a
Skip (forall s1 i1. s1 -> i1 -> InterposeSuffixState s1 i1
InterposeSuffixFirstInner s
s1 s
i')
Step s c
Stop -> forall s a. s -> Step s a
Skip (forall s1 i1. s1 -> InterposeSuffixState s1 i1
InterposeSuffixSecond s
s1)
step State Stream m a
_ (InterposeSuffixSecond s
s1) = do
c
r <- m c
action
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield c
r (forall s1 i1. s1 -> InterposeSuffixState s1 i1
InterposeSuffixFirst s
s1)
{-# ANN type InterposeState Fuse #-}
data InterposeState s1 i1 a =
InterposeFirst s1
| InterposeFirstInner s1 i1
| InterposeFirstInject s1
| InterposeSecondYield s1 i1
{-# INLINE_NORMAL interpose #-}
interpose :: Monad m => m c -> Unfold m b c -> Stream m b -> Stream m c
interpose :: forall (m :: * -> *) c b.
Monad m =>
m c -> Unfold m b c -> Stream m b -> Stream m c
interpose
m c
action
(Unfold s -> m (Step s c)
istep1 b -> m s
inject1) (Stream State Stream m b -> s -> m (Step s b)
step1 s
state1) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a} {a} {a}.
State Stream m a
-> InterposeState s s a -> m (Step (InterposeState s s a) c)
step (forall s1 i1 a. s1 -> InterposeState s1 i1 a
InterposeFirst s
state1)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> InterposeState s s a -> m (Step (InterposeState s s a) c)
step State Stream m a
gst (InterposeFirst s
s1) = do
Step s b
r <- State Stream m b -> s -> m (Step s b)
step1 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s1
case Step s b
r of
Yield b
a s
s -> do
s
i <- b -> m s
inject1 b
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 i1 a. s1 -> i1 -> InterposeState s1 i1 a
InterposeFirstInner s
s s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 i1 a. s1 -> InterposeState s1 i1 a
InterposeFirst s
s)
Step s b
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (InterposeFirstInner s
s1 s
i1) = do
Step s c
r <- s -> m (Step s c)
istep1 s
i1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s c
r of
Yield c
x s
i' -> forall s a. a -> s -> Step s a
Yield c
x (forall s1 i1 a. s1 -> i1 -> InterposeState s1 i1 a
InterposeFirstInner s
s1 s
i')
Skip s
i' -> forall s a. s -> Step s a
Skip (forall s1 i1 a. s1 -> i1 -> InterposeState s1 i1 a
InterposeFirstInner s
s1 s
i')
Step s c
Stop -> forall s a. s -> Step s a
Skip (forall s1 i1 a. s1 -> InterposeState s1 i1 a
InterposeFirstInject s
s1)
step State Stream m a
gst (InterposeFirstInject s
s1) = do
Step s b
r <- State Stream m b -> s -> m (Step s b)
step1 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s1
case Step s b
r of
Yield b
a s
s -> do
s
i <- b -> m s
inject1 b
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 i1 a. s1 -> i1 -> InterposeState s1 i1 a
InterposeSecondYield s
s s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 i1 a. s1 -> InterposeState s1 i1 a
InterposeFirstInject s
s)
Step s b
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (InterposeSecondYield s
s1 s
i1) = do
c
r <- m c
action
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield c
r (forall s1 i1 a. s1 -> i1 -> InterposeState s1 i1 a
InterposeFirstInner s
s1 s
i1)
data ICUState s1 s2 i1 i2 =
ICUFirst s1 s2
| ICUSecond s1 s2
| ICUSecondOnly s2
| ICUFirstOnly s1
| ICUFirstInner s1 s2 i1
| ICUSecondInner s1 s2 i2
| ICUFirstOnlyInner s1 i1
| ICUSecondOnlyInner s2 i2
{-# INLINE_NORMAL gintercalateSuffix #-}
gintercalateSuffix
:: Monad m
=> Unfold m a c -> Stream m a -> Unfold m b c -> Stream m b -> Stream m c
gintercalateSuffix :: forall (m :: * -> *) a c b.
Monad m =>
Unfold m a c
-> Stream m a -> Unfold m b c -> Stream m b -> Stream m c
gintercalateSuffix
(Unfold s -> m (Step s c)
istep1 a -> m s
inject1) (Stream State Stream m a -> s -> m (Step s a)
step1 s
state1)
(Unfold s -> m (Step s c)
istep2 b -> m s
inject2) (Stream State Stream m b -> s -> m (Step s b)
step2 s
state2) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> ICUState s s s s -> m (Step (ICUState s s s s) c)
step (forall s1 s2 i1 i2. s1 -> s2 -> ICUState s1 s2 i1 i2
ICUFirst s
state1 s
state2)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> ICUState s s s s -> m (Step (ICUState s s s s) c)
step State Stream m a
gst (ICUFirst s
s1 s
s2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s1
case Step s a
r of
Yield a
a s
s -> do
s
i <- a -> m s
inject1 a
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> s2 -> i1 -> ICUState s1 s2 i1 i2
ICUFirstInner s
s s
s2 s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> s2 -> ICUState s1 s2 i1 i2
ICUFirst s
s s
s2)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
gst (ICUFirstOnly s
s1) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s1
case Step s a
r of
Yield a
a s
s -> do
s
i <- a -> m s
inject1 a
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> i1 -> ICUState s1 s2 i1 i2
ICUFirstOnlyInner s
s s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> ICUState s1 s2 i1 i2
ICUFirstOnly s
s)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (ICUFirstInner s
s1 s
s2 s
i1) = do
Step s c
r <- s -> m (Step s c)
istep1 s
i1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s c
r of
Yield c
x s
i' -> forall s a. a -> s -> Step s a
Yield c
x (forall s1 s2 i1 i2. s1 -> s2 -> i1 -> ICUState s1 s2 i1 i2
ICUFirstInner s
s1 s
s2 s
i')
Skip s
i' -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> s2 -> i1 -> ICUState s1 s2 i1 i2
ICUFirstInner s
s1 s
s2 s
i')
Step s c
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> s2 -> ICUState s1 s2 i1 i2
ICUSecond s
s1 s
s2)
step State Stream m a
_ (ICUFirstOnlyInner s
s1 s
i1) = do
Step s c
r <- s -> m (Step s c)
istep1 s
i1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s c
r of
Yield c
x s
i' -> forall s a. a -> s -> Step s a
Yield c
x (forall s1 s2 i1 i2. s1 -> i1 -> ICUState s1 s2 i1 i2
ICUFirstOnlyInner s
s1 s
i')
Skip s
i' -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> i1 -> ICUState s1 s2 i1 i2
ICUFirstOnlyInner s
s1 s
i')
Step s c
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> ICUState s1 s2 i1 i2
ICUFirstOnly s
s1)
step State Stream m a
gst (ICUSecond s
s1 s
s2) = do
Step s b
r <- State Stream m b -> s -> m (Step s b)
step2 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s2
case Step s b
r of
Yield b
a s
s -> do
s
i <- b -> m s
inject2 b
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> s2 -> i2 -> ICUState s1 s2 i1 i2
ICUSecondInner s
s1 s
s s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> s2 -> ICUState s1 s2 i1 i2
ICUSecond s
s1 s
s)
Step s b
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> ICUState s1 s2 i1 i2
ICUFirstOnly s
s1)
step State Stream m a
_ (ICUSecondInner s
s1 s
s2 s
i2) = do
Step s c
r <- s -> m (Step s c)
istep2 s
i2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s c
r of
Yield c
x s
i' -> forall s a. a -> s -> Step s a
Yield c
x (forall s1 s2 i1 i2. s1 -> s2 -> i2 -> ICUState s1 s2 i1 i2
ICUSecondInner s
s1 s
s2 s
i')
Skip s
i' -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> s2 -> i2 -> ICUState s1 s2 i1 i2
ICUSecondInner s
s1 s
s2 s
i')
Step s c
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2. s1 -> s2 -> ICUState s1 s2 i1 i2
ICUFirst s
s1 s
s2)
step State Stream m a
_ (ICUSecondOnly s
_s2) = forall a. HasCallStack => a
undefined
step State Stream m a
_ (ICUSecondOnlyInner s
_s2 s
_i2) = forall a. HasCallStack => a
undefined
data ICALState s1 s2 i1 i2 a =
ICALFirst s1 s2
| ICALFirstInner s1 s2 i1
| ICALFirstOnly s1
| ICALFirstOnlyInner s1 i1
| ICALSecondInject s1 s2
| ICALFirstInject s1 s2 i2
| ICALSecondInner s1 s2 i1 i2
{-# INLINE_NORMAL gintercalate #-}
gintercalate
:: Monad m
=> Unfold m a c -> Stream m a -> Unfold m b c -> Stream m b -> Stream m c
gintercalate :: forall (m :: * -> *) a c b.
Monad m =>
Unfold m a c
-> Stream m a -> Unfold m b c -> Stream m b -> Stream m c
gintercalate
(Unfold s -> m (Step s c)
istep1 a -> m s
inject1) (Stream State Stream m a -> s -> m (Step s a)
step1 s
state1)
(Unfold s -> m (Step s c)
istep2 b -> m s
inject2) (Stream State Stream m b -> s -> m (Step s b)
step2 s
state2) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a} {a} {a}.
State Stream m a
-> ICALState s s s s a -> m (Step (ICALState s s s s a) c)
step (forall s1 s2 i1 i2 a. s1 -> s2 -> ICALState s1 s2 i1 i2 a
ICALFirst s
state1 s
state2)
where
{-# INLINE_LATE step #-}
step :: State Stream m a
-> ICALState s s s s a -> m (Step (ICALState s s s s a) c)
step State Stream m a
gst (ICALFirst s
s1 s
s2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s1
case Step s a
r of
Yield a
a s
s -> do
s
i <- a -> m s
inject1 a
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> s2 -> i1 -> ICALState s1 s2 i1 i2 a
ICALFirstInner s
s s
s2 s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> s2 -> ICALState s1 s2 i1 i2 a
ICALFirst s
s s
s2)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (ICALFirstInner s
s1 s
s2 s
i1) = do
Step s c
r <- s -> m (Step s c)
istep1 s
i1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s c
r of
Yield c
x s
i' -> forall s a. a -> s -> Step s a
Yield c
x (forall s1 s2 i1 i2 a. s1 -> s2 -> i1 -> ICALState s1 s2 i1 i2 a
ICALFirstInner s
s1 s
s2 s
i')
Skip s
i' -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> s2 -> i1 -> ICALState s1 s2 i1 i2 a
ICALFirstInner s
s1 s
s2 s
i')
Step s c
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> s2 -> ICALState s1 s2 i1 i2 a
ICALSecondInject s
s1 s
s2)
step State Stream m a
gst (ICALFirstOnly s
s1) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s1
case Step s a
r of
Yield a
a s
s -> do
s
i <- a -> m s
inject1 a
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> i1 -> ICALState s1 s2 i1 i2 a
ICALFirstOnlyInner s
s s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> ICALState s1 s2 i1 i2 a
ICALFirstOnly s
s)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (ICALFirstOnlyInner s
s1 s
i1) = do
Step s c
r <- s -> m (Step s c)
istep1 s
i1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s c
r of
Yield c
x s
i' -> forall s a. a -> s -> Step s a
Yield c
x (forall s1 s2 i1 i2 a. s1 -> i1 -> ICALState s1 s2 i1 i2 a
ICALFirstOnlyInner s
s1 s
i')
Skip s
i' -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> i1 -> ICALState s1 s2 i1 i2 a
ICALFirstOnlyInner s
s1 s
i')
Step s c
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> ICALState s1 s2 i1 i2 a
ICALFirstOnly s
s1)
step State Stream m a
gst (ICALSecondInject s
s1 s
s2) = do
Step s b
r <- State Stream m b -> s -> m (Step s b)
step2 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s2
case Step s b
r of
Yield b
a s
s -> do
s
i <- b -> m s
inject2 b
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> s2 -> i2 -> ICALState s1 s2 i1 i2 a
ICALFirstInject s
s1 s
s s
i))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> s2 -> ICALState s1 s2 i1 i2 a
ICALSecondInject s
s1 s
s)
Step s b
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> ICALState s1 s2 i1 i2 a
ICALFirstOnly s
s1)
step State Stream m a
gst (ICALFirstInject s
s1 s
s2 s
i2) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step1 (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
s1
case Step s a
r of
Yield a
a s
s -> do
s
i <- a -> m s
inject1 a
a
s
i seq :: forall a b. a -> b -> b
`seq` forall (m :: * -> *) a. Monad m => a -> m a
return (forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a.
s1 -> s2 -> i1 -> i2 -> ICALState s1 s2 i1 i2 a
ICALSecondInner s
s s
s2 s
i s
i2))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> s2 -> i2 -> ICALState s1 s2 i1 i2 a
ICALFirstInject s
s s
s2 s
i2)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m a
_ (ICALSecondInner s
s1 s
s2 s
i1 s
i2) = do
Step s c
r <- s -> m (Step s c)
istep2 s
i2
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s c
r of
Yield c
x s
i' -> forall s a. a -> s -> Step s a
Yield c
x (forall s1 s2 i1 i2 a.
s1 -> s2 -> i1 -> i2 -> ICALState s1 s2 i1 i2 a
ICALSecondInner s
s1 s
s2 s
i1 s
i')
Skip s
i' -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a.
s1 -> s2 -> i1 -> i2 -> ICALState s1 s2 i1 i2 a
ICALSecondInner s
s1 s
s2 s
i1 s
i')
Step s c
Stop -> forall s a. s -> Step s a
Skip (forall s1 s2 i1 i2 a. s1 -> s2 -> i1 -> ICALState s1 s2 i1 i2 a
ICALFirstInner s
s1 s
s2 s
i1)
{-# ANN type FIterState Fuse #-}
data FIterState s f m a b
= FIterInit s f
| forall fs. FIterStream s (fs -> a -> m (FL.Step fs b)) fs (fs -> m b)
| FIterYield b (FIterState s f m a b)
| FIterStop
{-# INLINE_NORMAL foldIterateM #-}
foldIterateM ::
Monad m => (b -> m (FL.Fold m a b)) -> m b -> Stream m a -> Stream m b
foldIterateM :: forall (m :: * -> *) b a.
Monad m =>
(b -> m (Fold m a b)) -> m b -> Stream m a -> Stream m b
foldIterateM b -> m (Fold m a b)
func m b
seed0 (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> FIterState s (m b) m a b
-> m (Step (FIterState s (m b) m a b) b)
stepOuter (forall s f (m :: * -> *) a b. s -> f -> FIterState s f m a b
FIterInit s
state m b
seed0)
where
{-# INLINE iterStep #-}
iterStep :: m (Step fs a)
-> s
-> (fs -> a -> m (Step fs a))
-> (fs -> m a)
-> m (Step (FIterState s (m a) m a a) a)
iterStep m (Step fs a)
from s
st fs -> a -> m (Step fs a)
fstep fs -> m a
extract = do
Step fs a
res <- m (Step fs a)
from
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip
forall a b. (a -> b) -> a -> b
$ case Step fs a
res of
FL.Partial fs
fs -> forall s f (m :: * -> *) a b fs.
s
-> (fs -> a -> m (Step fs b))
-> fs
-> (fs -> m b)
-> FIterState s f m a b
FIterStream s
st fs -> a -> m (Step fs a)
fstep fs
fs fs -> m a
extract
FL.Done a
fb -> forall s f (m :: * -> *) a b.
b -> FIterState s f m a b -> FIterState s f m a b
FIterYield a
fb forall a b. (a -> b) -> a -> b
$ forall s f (m :: * -> *) a b. s -> f -> FIterState s f m a b
FIterInit s
st (forall (m :: * -> *) a. Monad m => a -> m a
return a
fb)
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> FIterState s (m b) m a b
-> m (Step (FIterState s (m b) m a b) b)
stepOuter State Stream m a
_ (FIterInit s
st m b
seed) = do
(FL.Fold s -> a -> m (Step s b)
fstep m (Step s b)
initial s -> m b
extract) <- m b
seed forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= b -> m (Fold m a b)
func
forall {m :: * -> *} {m :: * -> *} {fs} {a} {s} {a} {m :: * -> *}
{a}.
(Monad m, Monad m) =>
m (Step fs a)
-> s
-> (fs -> a -> m (Step fs a))
-> (fs -> m a)
-> m (Step (FIterState s (m a) m a a) a)
iterStep m (Step s b)
initial s
st s -> a -> m (Step s b)
fstep s -> m b
extract
stepOuter State Stream m a
gst (FIterStream s
st fs -> a -> m (Step fs b)
fstep fs
fs fs -> m b
extract) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
r of
Yield a
x s
s -> do
forall {m :: * -> *} {m :: * -> *} {fs} {a} {s} {a} {m :: * -> *}
{a}.
(Monad m, Monad m) =>
m (Step fs a)
-> s
-> (fs -> a -> m (Step fs a))
-> (fs -> m a)
-> m (Step (FIterState s (m a) m a a) a)
iterStep (fs -> a -> m (Step fs b)
fstep fs
fs a
x) s
s fs -> a -> m (Step fs b)
fstep fs -> m b
extract
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall s f (m :: * -> *) a b fs.
s
-> (fs -> a -> m (Step fs b))
-> fs
-> (fs -> m b)
-> FIterState s f m a b
FIterStream s
s fs -> a -> m (Step fs b)
fstep fs
fs fs -> m b
extract
Step s a
Stop -> do
b
b <- fs -> m b
extract fs
fs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall s f (m :: * -> *) a b.
b -> FIterState s f m a b -> FIterState s f m a b
FIterYield b
b forall s f (m :: * -> *) a b. FIterState s f m a b
FIterStop
stepOuter State Stream m a
_ (FIterYield b
a FIterState s (m b) m a b
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
a FIterState s (m b) m a b
next
stepOuter State Stream m a
_ FIterState s (m b) m a b
FIterStop = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
{-# ANN type CIterState Fuse #-}
data CIterState s f fs b
= CIterInit s f
| CIterConsume s fs
| CIterYield b (CIterState s f fs b)
| CIterStop
{-# INLINE_NORMAL refoldIterateM #-}
refoldIterateM ::
Monad m => Refold m b a b -> m b -> Stream m a -> Stream m b
refoldIterateM :: forall (m :: * -> *) b a.
Monad m =>
Refold m b a b -> m b -> Stream m a -> Stream m b
refoldIterateM (Refold s -> a -> m (Step s b)
fstep b -> m (Step s b)
finject s -> m b
fextract) m b
initial (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> CIterState s (m b) s b -> m (Step (CIterState s (m b) s b) b)
stepOuter (forall s f fs b. s -> f -> CIterState s f fs b
CIterInit s
state m b
initial)
where
{-# INLINE iterStep #-}
iterStep :: s -> m (Step fs a) -> m (Step (CIterState s (m a) fs a) a)
iterStep s
st m (Step fs a)
action = do
Step fs a
res <- m (Step fs a)
action
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip
forall a b. (a -> b) -> a -> b
$ case Step fs a
res of
FL.Partial fs
fs -> forall s f fs b. s -> fs -> CIterState s f fs b
CIterConsume s
st fs
fs
FL.Done a
fb -> forall s f fs b. b -> CIterState s f fs b -> CIterState s f fs b
CIterYield a
fb forall a b. (a -> b) -> a -> b
$ forall s f fs b. s -> f -> CIterState s f fs b
CIterInit s
st (forall (m :: * -> *) a. Monad m => a -> m a
return a
fb)
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> CIterState s (m b) s b -> m (Step (CIterState s (m b) s b) b)
stepOuter State Stream m a
_ (CIterInit s
st m b
action) = do
forall {m :: * -> *} {m :: * -> *} {s} {fs} {a} {a}.
(Monad m, Monad m) =>
s -> m (Step fs a) -> m (Step (CIterState s (m a) fs a) a)
iterStep s
st (m b
action forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= b -> m (Step s b)
finject)
stepOuter State Stream m a
gst (CIterConsume s
st s
fs) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
r of
Yield a
x s
s -> forall {m :: * -> *} {m :: * -> *} {s} {fs} {a} {a}.
(Monad m, Monad m) =>
s -> m (Step fs a) -> m (Step (CIterState s (m a) fs a) a)
iterStep s
s (s -> a -> m (Step s b)
fstep s
fs a
x)
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall s f fs b. s -> fs -> CIterState s f fs b
CIterConsume s
s s
fs
Step s a
Stop -> do
b
b <- s -> m b
fextract s
fs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall s f fs b. b -> CIterState s f fs b -> CIterState s f fs b
CIterYield b
b forall s f fs b. CIterState s f fs b
CIterStop
stepOuter State Stream m a
_ (CIterYield b
a CIterState s (m b) s b
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
a CIterState s (m b) s b
next
stepOuter State Stream m a
_ CIterState s (m b) s b
CIterStop = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
{-# INLINE sliceBy #-}
sliceBy :: Monad m => Fold m a Int -> Int -> Refold m (Int, Int) a (Int, Int)
sliceBy :: forall (m :: * -> *) a.
Monad m =>
Fold m a Int -> Int -> Refold m (Int, Int) a (Int, Int)
sliceBy (Fold s -> a -> m (Step s Int)
step1 m (Step s Int)
initial1 s -> m Int
extract1) Int
n = forall (m :: * -> *) c a b s.
(s -> a -> m (Step s b))
-> (c -> m (Step s b)) -> (s -> m b) -> Refold m c a b
Refold forall {a}. Tuple' a s -> a -> m (Step (Tuple' a s) (a, Int))
step (Int, Int) -> m (Step (Tuple' Int s) (Int, Int))
inject forall {t}. Tuple' t s -> m (t, Int)
extract
where
inject :: (Int, Int) -> m (Step (Tuple' Int s) (Int, Int))
inject (Int
i, Int
len) = do
Step s Int
r <- m (Step s Int)
initial1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s Int
r of
Partial s
s -> forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> Tuple' a b
Tuple' (Int
i forall a. Num a => a -> a -> a
+ Int
len forall a. Num a => a -> a -> a
+ Int
n) s
s
Done Int
l -> forall s b. b -> Step s b
Done (Int
i, Int
l)
step :: Tuple' a s -> a -> m (Step (Tuple' a s) (a, Int))
step (Tuple' a
i s
s) a
x = do
Step s Int
r <- s -> a -> m (Step s Int)
step1 s
s a
x
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Step s Int
r of
Partial s
s1 -> forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> Tuple' a b
Tuple' a
i s
s1
Done Int
len -> forall s b. b -> Step s b
Done (a
i, Int
len)
extract :: Tuple' t s -> m (t, Int)
extract (Tuple' t
i s
s) = (t
i,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m Int
extract1 s
s
{-# INLINE sliceOnSuffix #-}
sliceOnSuffix :: Monad m => (a -> Bool) -> Stream m a -> Stream m (Int, Int)
sliceOnSuffix :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Stream m a -> Stream m (Int, Int)
sliceOnSuffix a -> Bool
predicate =
forall (m :: * -> *) b a.
Monad m =>
Refold m b a b -> m b -> Stream m a -> Stream m b
refoldIterateM
(forall (m :: * -> *) a.
Monad m =>
Fold m a Int -> Int -> Refold m (Int, Int) a (Int, Int)
sliceBy (forall (m :: * -> *) a b.
Monad m =>
(a -> Bool) -> Fold m a b -> Fold m a b
FL.takeEndBy_ a -> Bool
predicate forall (m :: * -> *) a. Monad m => Fold m a Int
FL.length) Int
1)
(forall (m :: * -> *) a. Monad m => a -> m a
return (-Int
1, Int
0))
{-# ANN type ParseChunksState Fuse #-}
data ParseChunksState x inpBuf st pst =
ParseChunksInit inpBuf st
| ParseChunksInitLeftOver inpBuf
| ParseChunksStream st inpBuf !pst
| ParseChunksBuf inpBuf st inpBuf !pst
| ParseChunksYield x (ParseChunksState x inpBuf st pst)
{-# INLINE_NORMAL parseMany #-}
parseMany
:: MonadThrow m
=> PRD.Parser m a b
-> Stream m a
-> Stream m b
parseMany :: forall (m :: * -> *) a b.
MonadThrow m =>
Parser m a b -> Stream m a -> Stream m b
parseMany (PRD.Parser s -> a -> m (Step s b)
pstep m (Initial s b)
initial s -> m b
extract) (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> ParseChunksState b [a] s s
-> m (Step (ParseChunksState b [a] s s) b)
stepOuter (forall x inpBuf st pst.
inpBuf -> st -> ParseChunksState x inpBuf st pst
ParseChunksInit [] s
state)
where
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> ParseChunksState b [a] s s
-> m (Step (ParseChunksState b [a] s s) b)
stepOuter State Stream m a
gst (ParseChunksInit [] s
st) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
r of
Yield a
x s
s -> do
Initial s b
res <- m (Initial s b)
initial
case Initial s b
res of
PRD.IPartial s
ps ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksBuf [a
x] s
s [] s
ps
PRD.IDone b
pb ->
let next :: ParseChunksState x [a] s pst
next = forall x inpBuf st pst.
inpBuf -> st -> ParseChunksState x inpBuf st pst
ParseChunksInit [a
x] s
s
in forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
x
-> ParseChunksState x inpBuf st pst
-> ParseChunksState x inpBuf st pst
ParseChunksYield b
pb forall {x} {pst}. ParseChunksState x [a] s pst
next
PRD.IError String
err -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ String -> ParseError
ParseError String
err
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> ParseChunksState x inpBuf st pst
ParseChunksInit [] s
s
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
_ (ParseChunksInit [a]
src s
st) = do
Initial s b
res <- m (Initial s b)
initial
case Initial s b
res of
PRD.IPartial s
ps ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksBuf [a]
src s
st [] s
ps
PRD.IDone b
pb ->
let next :: ParseChunksState x [a] s pst
next = forall x inpBuf st pst.
inpBuf -> st -> ParseChunksState x inpBuf st pst
ParseChunksInit [a]
src s
st
in forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
x
-> ParseChunksState x inpBuf st pst
-> ParseChunksState x inpBuf st pst
ParseChunksYield b
pb forall {x} {pst}. ParseChunksState x [a] s pst
next
PRD.IError String
err -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ String -> ParseError
ParseError String
err
stepOuter State Stream m a
_ (ParseChunksInitLeftOver [a]
_) = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
gst (ParseChunksStream s
st [a]
buf s
pst) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
r of
Yield a
x s
s -> do
Step s b
pRes <- s -> a -> m (Step s b)
pstep s
pst a
x
case Step s b
pRes of
PR.Partial Int
0 s
pst1 ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksStream s
s [] s
pst1
PR.Partial Int
n s
pst1 -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let src0 :: [a]
src0 = forall a. Int -> [a] -> [a]
Prelude.take Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)
src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
src0
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksBuf [a]
src s
s [] s
pst1
PR.Continue Int
0 s
pst1 ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksStream s
s (a
xforall a. a -> [a] -> [a]
:[a]
buf) s
pst1
PR.Continue Int
n s
pst1 -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let ([a]
src0, [a]
buf1) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)
src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
src0
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksBuf [a]
src s
s [a]
buf1 s
pst1
PR.Done Int
0 b
b -> do
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$
forall x inpBuf st pst.
x
-> ParseChunksState x inpBuf st pst
-> ParseChunksState x inpBuf st pst
ParseChunksYield b
b (forall x inpBuf st pst.
inpBuf -> st -> ParseChunksState x inpBuf st pst
ParseChunksInit [] s
s)
PR.Done Int
n b
b -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse (forall a. Int -> [a] -> [a]
Prelude.take Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf))
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$
forall x inpBuf st pst.
x
-> ParseChunksState x inpBuf st pst
-> ParseChunksState x inpBuf st pst
ParseChunksYield b
b (forall x inpBuf st pst.
inpBuf -> st -> ParseChunksState x inpBuf st pst
ParseChunksInit [a]
src s
s)
PR.Error String
err -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ String -> ParseError
ParseError String
err
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksStream s
s [a]
buf s
pst
Step s a
Stop -> do
b
b <- s -> m b
extract s
pst
let src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
buf
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$
forall x inpBuf st pst.
x
-> ParseChunksState x inpBuf st pst
-> ParseChunksState x inpBuf st pst
ParseChunksYield b
b (forall x inpBuf st pst. inpBuf -> ParseChunksState x inpBuf st pst
ParseChunksInitLeftOver [a]
src)
stepOuter State Stream m a
_ (ParseChunksBuf [] s
s [a]
buf s
pst) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksStream s
s [a]
buf s
pst
stepOuter State Stream m a
_ (ParseChunksBuf (a
x:[a]
xs) s
s [a]
buf s
pst) = do
Step s b
pRes <- s -> a -> m (Step s b)
pstep s
pst a
x
case Step s b
pRes of
PR.Partial Int
0 s
pst1 ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksBuf [a]
xs s
s [] s
pst1
PR.Partial Int
n s
pst1 -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let src0 :: [a]
src0 = forall a. Int -> [a] -> [a]
Prelude.take Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)
src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
src0 forall a. [a] -> [a] -> [a]
++ [a]
xs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksBuf [a]
src s
s [] s
pst1
PR.Continue Int
0 s
pst1 ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksBuf [a]
xs s
s (a
xforall a. a -> [a] -> [a]
:[a]
buf) s
pst1
PR.Continue Int
n s
pst1 -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let ([a]
src0, [a]
buf1) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)
src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
src0 forall a. [a] -> [a] -> [a]
++ [a]
xs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
inpBuf -> st -> inpBuf -> pst -> ParseChunksState x inpBuf st pst
ParseChunksBuf [a]
src s
s [a]
buf1 s
pst1
PR.Done Int
0 b
b ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
x
-> ParseChunksState x inpBuf st pst
-> ParseChunksState x inpBuf st pst
ParseChunksYield b
b (forall x inpBuf st pst.
inpBuf -> st -> ParseChunksState x inpBuf st pst
ParseChunksInit [a]
xs s
s)
PR.Done Int
n b
b -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse (forall a. Int -> [a] -> [a]
Prelude.take Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)) forall a. [a] -> [a] -> [a]
++ [a]
xs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall x inpBuf st pst.
x
-> ParseChunksState x inpBuf st pst
-> ParseChunksState x inpBuf st pst
ParseChunksYield b
b (forall x inpBuf st pst.
inpBuf -> st -> ParseChunksState x inpBuf st pst
ParseChunksInit [a]
src s
s)
PR.Error String
err -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ String -> ParseError
ParseError String
err
stepOuter State Stream m a
_ (ParseChunksYield b
a ParseChunksState b [a] s s
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
a ParseChunksState b [a] s s
next
{-# ANN type ConcatParseState Fuse #-}
data ConcatParseState b inpBuf st p m a =
ConcatParseInit inpBuf st p
| ConcatParseInitLeftOver inpBuf
| forall s. ConcatParseStream st inpBuf (s -> a -> m (PRD.Step s b)) s (s -> m b)
| forall s. ConcatParseBuf inpBuf st inpBuf (s -> a -> m (PRD.Step s b)) s (s -> m b)
| ConcatParseYield b (ConcatParseState b inpBuf st p m a)
{-# INLINE_NORMAL parseIterate #-}
parseIterate
:: MonadThrow m
=> (b -> PRD.Parser m a b)
-> b
-> Stream m a
-> Stream m b
parseIterate :: forall (m :: * -> *) b a.
MonadThrow m =>
(b -> Parser m a b) -> b -> Stream m a -> Stream m b
parseIterate b -> Parser m a b
func b
seed (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> ConcatParseState b [a] s (Parser m a b) m a
-> m (Step (ConcatParseState b [a] s (Parser m a b) m a) b)
stepOuter (forall b inpBuf st p (m :: * -> *) a.
inpBuf -> st -> p -> ConcatParseState b inpBuf st p m a
ConcatParseInit [] s
state (b -> Parser m a b
func b
seed))
where
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> ConcatParseState b [a] s (Parser m a b) m a
-> m (Step (ConcatParseState b [a] s (Parser m a b) m a) b)
stepOuter State Stream m a
_ (ConcatParseInit [] s
st (PRD.Parser s -> a -> m (Step s b)
pstep m (Initial s b)
initial s -> m b
extract)) = do
Initial s b
res <- m (Initial s b)
initial
case Initial s b
res of
PRD.IPartial s
ps ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseStream s
st [] s -> a -> m (Step s b)
pstep s
ps s -> m b
extract
PRD.IDone b
pb ->
let next :: ConcatParseState b [a] s (Parser m a b) m a
next = forall b inpBuf st p (m :: * -> *) a.
inpBuf -> st -> p -> ConcatParseState b inpBuf st p m a
ConcatParseInit [] s
st (b -> Parser m a b
func b
pb)
in forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a.
b
-> ConcatParseState b inpBuf st p m a
-> ConcatParseState b inpBuf st p m a
ConcatParseYield b
pb forall {b} {a} {m :: * -> *} {a}.
ConcatParseState b [a] s (Parser m a b) m a
next
PRD.IError String
err -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ String -> ParseError
ParseError String
err
stepOuter State Stream m a
_ (ConcatParseInit [a]
src s
st
(PRD.Parser s -> a -> m (Step s b)
pstep m (Initial s b)
initial s -> m b
extract)) = do
Initial s b
res <- m (Initial s b)
initial
case Initial s b
res of
PRD.IPartial s
ps ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
inpBuf
-> st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseBuf [a]
src s
st [] s -> a -> m (Step s b)
pstep s
ps s -> m b
extract
PRD.IDone b
pb ->
let next :: ConcatParseState b [a] s (Parser m a b) m a
next = forall b inpBuf st p (m :: * -> *) a.
inpBuf -> st -> p -> ConcatParseState b inpBuf st p m a
ConcatParseInit [a]
src s
st (b -> Parser m a b
func b
pb)
in forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a.
b
-> ConcatParseState b inpBuf st p m a
-> ConcatParseState b inpBuf st p m a
ConcatParseYield b
pb forall {b} {m :: * -> *} {a}.
ConcatParseState b [a] s (Parser m a b) m a
next
PRD.IError String
err -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ String -> ParseError
ParseError String
err
stepOuter State Stream m a
_ (ConcatParseInitLeftOver [a]
_) = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
gst (ConcatParseStream s
st [a]
buf s -> a -> m (Step s b)
pstep s
pst s -> m b
extract) = do
Step s a
r <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
r of
Yield a
x s
s -> do
Step s b
pRes <- s -> a -> m (Step s b)
pstep s
pst a
x
case Step s b
pRes of
PR.Partial Int
0 s
pst1 ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseStream s
s [] s -> a -> m (Step s b)
pstep s
pst1 s -> m b
extract
PR.Partial Int
n s
pst1 -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let src0 :: [a]
src0 = forall a. Int -> [a] -> [a]
Prelude.take Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)
src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
src0
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
inpBuf
-> st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseBuf [a]
src s
s [] s -> a -> m (Step s b)
pstep s
pst1 s -> m b
extract
PR.Continue Int
n s
pst1 -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let ([a]
src0, [a]
buf1) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)
src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
src0
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
inpBuf
-> st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseBuf [a]
src s
s [a]
buf1 s -> a -> m (Step s b)
pstep s
pst1 s -> m b
extract
PR.Done Int
n b
b -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse (forall a. Int -> [a] -> [a]
Prelude.take Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf))
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$
forall b inpBuf st p (m :: * -> *) a.
b
-> ConcatParseState b inpBuf st p m a
-> ConcatParseState b inpBuf st p m a
ConcatParseYield b
b (forall b inpBuf st p (m :: * -> *) a.
inpBuf -> st -> p -> ConcatParseState b inpBuf st p m a
ConcatParseInit [a]
src s
s (b -> Parser m a b
func b
b))
PR.Error String
err -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ String -> ParseError
ParseError String
err
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseStream s
s [a]
buf s -> a -> m (Step s b)
pstep s
pst s -> m b
extract
Step s a
Stop -> do
b
b <- s -> m b
extract s
pst
let src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
buf
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a.
b
-> ConcatParseState b inpBuf st p m a
-> ConcatParseState b inpBuf st p m a
ConcatParseYield b
b (forall b inpBuf st p (m :: * -> *) a.
inpBuf -> ConcatParseState b inpBuf st p m a
ConcatParseInitLeftOver [a]
src)
stepOuter State Stream m a
_ (ConcatParseBuf [] s
s [a]
buf s -> a -> m (Step s b)
pstep s
ps s -> m b
extract) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseStream s
s [a]
buf s -> a -> m (Step s b)
pstep s
ps s -> m b
extract
stepOuter State Stream m a
_ (ConcatParseBuf (a
x:[a]
xs) s
s [a]
buf s -> a -> m (Step s b)
pstep s
pst s -> m b
extract) = do
Step s b
pRes <- s -> a -> m (Step s b)
pstep s
pst a
x
case Step s b
pRes of
PR.Partial Int
0 s
pst1 ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
inpBuf
-> st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseBuf [a]
xs s
s [] s -> a -> m (Step s b)
pstep s
pst1 s -> m b
extract
PR.Partial Int
n s
pst1 -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let src0 :: [a]
src0 = forall a. Int -> [a] -> [a]
Prelude.take Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)
src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
src0 forall a. [a] -> [a] -> [a]
++ [a]
xs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
inpBuf
-> st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseBuf [a]
src s
s [] s -> a -> m (Step s b)
pstep s
pst1 s -> m b
extract
PR.Continue Int
n s
pst1 -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let ([a]
src0, [a]
buf1) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)
src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse [a]
src0 forall a. [a] -> [a] -> [a]
++ [a]
xs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a s.
inpBuf
-> st
-> inpBuf
-> (s -> a -> m (Step s b))
-> s
-> (s -> m b)
-> ConcatParseState b inpBuf st p m a
ConcatParseBuf [a]
src s
s [a]
buf1 s -> a -> m (Step s b)
pstep s
pst1 s -> m b
extract
PR.Done Int
n b
b -> do
forall a. HasCallStack => Bool -> a -> a
assert (Int
n forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length (a
xforall a. a -> [a] -> [a]
:[a]
buf)) (forall (m :: * -> *) a. Monad m => a -> m a
return ())
let src :: [a]
src = forall a. [a] -> [a]
Prelude.reverse (forall a. Int -> [a] -> [a]
Prelude.take Int
n (a
xforall a. a -> [a] -> [a]
:[a]
buf)) forall a. [a] -> [a] -> [a]
++ [a]
xs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall b inpBuf st p (m :: * -> *) a.
b
-> ConcatParseState b inpBuf st p m a
-> ConcatParseState b inpBuf st p m a
ConcatParseYield b
b
(forall b inpBuf st p (m :: * -> *) a.
inpBuf -> st -> p -> ConcatParseState b inpBuf st p m a
ConcatParseInit [a]
src s
s (b -> Parser m a b
func b
b))
PR.Error String
err -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM forall a b. (a -> b) -> a -> b
$ String -> ParseError
ParseError String
err
stepOuter State Stream m a
_ (ConcatParseYield b
a ConcatParseState b [a] s (Parser m a b) m a
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
a ConcatParseState b [a] s (Parser m a b) m a
next
data GroupByState st fs a b
= GroupingInit st
| GroupingDo st !fs
| GroupingInitWith st !a
| GroupingDoWith st !fs !a
| GroupingYield !b (GroupByState st fs a b)
| GroupingDone
{-# INLINE_NORMAL groupsBy #-}
groupsBy :: Monad m
=> (a -> a -> Bool)
-> Fold m a b
-> Stream m a
-> Stream m b
groupsBy :: forall (m :: * -> *) a b.
Monad m =>
(a -> a -> Bool) -> Fold m a b -> Stream m a -> Stream m b
groupsBy a -> a -> Bool
cmp (Fold s -> a -> m (Step s b)
fstep m (Step s b)
initial s -> m b
done) (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a} {b} {b}.
State Stream m a
-> GroupByState s s a b -> m (Step (GroupByState s s a b) b)
stepOuter (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
state)
where
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> GroupByState s s a b -> m (Step (GroupByState s s a b) b)
stepOuter State Stream m a
_ (GroupingInit s
st) = do
Step s b
res <- m (Step s b)
initial
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ case Step s b
res of
FL.Partial s
s -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> fs -> GroupByState st fs a b
GroupingDo s
st s
s
FL.Done b
b -> forall s a. a -> s -> Step s a
Yield b
b forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
st
stepOuter State Stream m a
gst (GroupingDo s
st s
fs) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs a
x
case Step s b
r of
FL.Partial s
fs1 -> forall {fs} {b}.
SPEC -> a -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC a
x s
s s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
s)
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> fs -> GroupByState st fs a b
GroupingDo s
s s
fs
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
where
go :: SPEC -> a -> s -> s -> m (Step (GroupByState s fs a b) b)
go !SPEC
_ a
prev s
stt !s
acc = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
stt
case Step s a
res of
Yield a
x s
s -> do
if a -> a -> Bool
cmp a
x a
prev
then do
Step s b
r <- s -> a -> m (Step s b)
fstep s
acc a
x
case Step s b
r of
FL.Partial s
fs1 -> SPEC -> a -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC a
prev s
s s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
s)
else do
b
r <- s -> m b
done s
acc
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r (forall st fs a b. st -> a -> GroupByState st fs a b
GroupingInitWith s
s a
x)
Skip s
s -> SPEC -> a -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC a
prev s
s s
acc
Step s a
Stop -> s -> m b
done s
acc forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
r -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r forall st fs a b. GroupByState st fs a b
GroupingDone
stepOuter State Stream m a
_ (GroupingInitWith s
st a
x) = do
Step s b
res <- m (Step s b)
initial
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ case Step s b
res of
FL.Partial s
s -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> fs -> a -> GroupByState st fs a b
GroupingDoWith s
st s
s a
x
FL.Done b
b -> forall s a. a -> s -> Step s a
Yield b
b forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> a -> GroupByState st fs a b
GroupingInitWith s
st a
x
stepOuter State Stream m a
gst (GroupingDoWith s
st s
fs a
prev) = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
fs a
prev
case Step s b
res of
FL.Partial s
fs1 -> forall {fs} {b}.
SPEC -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC s
st s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
st)
where
go :: SPEC -> s -> s -> m (Step (GroupByState s fs a b) b)
go !SPEC
_ s
stt !s
acc = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
stt
case Step s a
res of
Yield a
x s
s -> do
if a -> a -> Bool
cmp a
x a
prev
then do
Step s b
r <- s -> a -> m (Step s b)
fstep s
acc a
x
case Step s b
r of
FL.Partial s
fs1 -> SPEC -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC s
s s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
s)
else do
b
r <- s -> m b
done s
acc
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r (forall st fs a b. st -> a -> GroupByState st fs a b
GroupingInitWith s
s a
x)
Skip s
s -> SPEC -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC s
s s
acc
Step s a
Stop -> s -> m b
done s
acc forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
r -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r forall st fs a b. GroupByState st fs a b
GroupingDone
stepOuter State Stream m a
_ (GroupingYield b
_ GroupByState s s a b
_) = forall a. HasCallStack => String -> a
error String
"groupsBy: Unreachable"
stepOuter State Stream m a
_ GroupByState s s a b
GroupingDone = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
{-# INLINE_NORMAL groupsRollingBy #-}
groupsRollingBy :: Monad m
=> (a -> a -> Bool)
-> Fold m a b
-> Stream m a
-> Stream m b
groupsRollingBy :: forall (m :: * -> *) a b.
Monad m =>
(a -> a -> Bool) -> Fold m a b -> Stream m a -> Stream m b
groupsRollingBy a -> a -> Bool
cmp (Fold s -> a -> m (Step s b)
fstep m (Step s b)
initial s -> m b
done) (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> GroupByState s s a b -> m (Step (GroupByState s s a b) b)
stepOuter (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
state)
where
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> GroupByState s s a b -> m (Step (GroupByState s s a b) b)
stepOuter State Stream m a
_ (GroupingInit s
st) = do
Step s b
res <- m (Step s b)
initial
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ case Step s b
res of
FL.Partial s
fs -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> fs -> GroupByState st fs a b
GroupingDo s
st s
fs
FL.Done b
fb -> forall s a. a -> s -> Step s a
Yield b
fb forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
st
stepOuter State Stream m a
gst (GroupingDo s
st s
fs) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs a
x
case Step s b
r of
FL.Partial s
fs1 -> forall {fs} {b}.
SPEC -> a -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC a
x s
s s
fs1
FL.Done b
fb -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
fb (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
s)
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> fs -> GroupByState st fs a b
GroupingDo s
s s
fs
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
where
go :: SPEC -> a -> s -> s -> m (Step (GroupByState s fs a b) b)
go !SPEC
_ a
prev s
stt !s
acc = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
stt
case Step s a
res of
Yield a
x s
s -> do
if a -> a -> Bool
cmp a
prev a
x
then do
Step s b
r <- s -> a -> m (Step s b)
fstep s
acc a
x
case Step s b
r of
FL.Partial s
fs1 -> SPEC -> a -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC a
x s
s s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
s)
else do
b
r <- s -> m b
done s
acc
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r (forall st fs a b. st -> a -> GroupByState st fs a b
GroupingInitWith s
s a
x)
Skip s
s -> SPEC -> a -> s -> s -> m (Step (GroupByState s fs a b) b)
go SPEC
SPEC a
prev s
s s
acc
Step s a
Stop -> s -> m b
done s
acc forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
r -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r forall st fs a b. GroupByState st fs a b
GroupingDone
stepOuter State Stream m a
_ (GroupingInitWith s
st a
x) = do
Step s b
res <- m (Step s b)
initial
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ case Step s b
res of
FL.Partial s
s -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> fs -> a -> GroupByState st fs a b
GroupingDoWith s
st s
s a
x
FL.Done b
b -> forall s a. a -> s -> Step s a
Yield b
b forall a b. (a -> b) -> a -> b
$ forall st fs a b. st -> a -> GroupByState st fs a b
GroupingInitWith s
st a
x
stepOuter State Stream m a
gst (GroupingDoWith s
st s
fs a
previous) = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
fs a
previous
case Step s b
res of
FL.Partial s
s -> SPEC -> a -> s -> s -> m (Step (GroupByState s s a b) b)
go SPEC
SPEC a
previous s
st s
s
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
st)
where
go :: SPEC -> a -> s -> s -> m (Step (GroupByState s s a b) b)
go !SPEC
_ a
prev !s
stt !s
acc = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
stt
case Step s a
res of
Yield a
x s
s -> do
if a -> a -> Bool
cmp a
prev a
x
then do
Step s b
r <- s -> a -> m (Step s b)
fstep s
acc a
x
case Step s b
r of
FL.Partial s
fs1 -> SPEC -> a -> s -> s -> m (Step (GroupByState s s a b) b)
go SPEC
SPEC a
x s
s s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
st)
else do
Step s b
result <- m (Step s b)
initial
b
r <- s -> m b
done s
acc
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r
forall a b. (a -> b) -> a -> b
$ case Step s b
result of
FL.Partial s
fsi -> forall st fs a b. st -> fs -> a -> GroupByState st fs a b
GroupingDoWith s
s s
fsi a
x
FL.Done b
b -> forall st fs a b.
b -> GroupByState st fs a b -> GroupByState st fs a b
GroupingYield b
b (forall st fs a b. st -> GroupByState st fs a b
GroupingInit s
s)
Skip s
s -> SPEC -> a -> s -> s -> m (Step (GroupByState s s a b) b)
go SPEC
SPEC a
prev s
s s
acc
Step s a
Stop -> s -> m b
done s
acc forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
r -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r forall st fs a b. GroupByState st fs a b
GroupingDone
stepOuter State Stream m a
_ (GroupingYield b
r GroupByState s s a b
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r GroupByState s s a b
next
stepOuter State Stream m a
_ GroupByState s s a b
GroupingDone = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
data WordsByState st fs b
= WordsByInit st
| WordsByDo st !fs
| WordsByDone
| WordsByYield !b (WordsByState st fs b)
{-# INLINE_NORMAL wordsBy #-}
wordsBy :: Monad m => (a -> Bool) -> Fold m a b -> Stream m a -> Stream m b
wordsBy :: forall (m :: * -> *) a b.
Monad m =>
(a -> Bool) -> Fold m a b -> Stream m a -> Stream m b
wordsBy a -> Bool
predicate (Fold s -> a -> m (Step s b)
fstep m (Step s b)
initial s -> m b
done) (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> WordsByState s s b -> m (Step (WordsByState s s b) b)
stepOuter (forall st fs b. st -> WordsByState st fs b
WordsByInit s
state)
where
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> WordsByState s s b -> m (Step (WordsByState s s b) b)
stepOuter State Stream m a
_ (WordsByInit s
st) = do
Step s b
res <- m (Step s b)
initial
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ case Step s b
res of
FL.Partial s
s -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs b. st -> fs -> WordsByState st fs b
WordsByDo s
st s
s
FL.Done b
b -> forall s a. a -> s -> Step s a
Yield b
b (forall st fs b. st -> WordsByState st fs b
WordsByInit s
st)
stepOuter State Stream m a
gst (WordsByDo s
st s
fs) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
if a -> Bool
predicate a
x
then do
Step s b
resi <- m (Step s b)
initial
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ case Step s b
resi of
FL.Partial s
fs1 -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs b. st -> fs -> WordsByState st fs b
WordsByDo s
s s
fs1
FL.Done b
b -> forall s a. a -> s -> Step s a
Yield b
b (forall st fs b. st -> WordsByState st fs b
WordsByInit s
s)
else do
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs a
x
case Step s b
r of
FL.Partial s
fs1 -> SPEC -> s -> s -> m (Step (WordsByState s s b) b)
go SPEC
SPEC s
s s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs b. st -> WordsByState st fs b
WordsByInit s
s)
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall st fs b. st -> fs -> WordsByState st fs b
WordsByDo s
s s
fs
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
where
go :: SPEC -> s -> s -> m (Step (WordsByState s s b) b)
go !SPEC
_ s
stt !s
acc = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
stt
case Step s a
res of
Yield a
x s
s -> do
if a -> Bool
predicate a
x
then do
Step s b
resi <- m (Step s b)
initial
b
r <- s -> m b
done s
acc
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r
forall a b. (a -> b) -> a -> b
$ case Step s b
resi of
FL.Partial s
fs1 -> forall st fs b. st -> fs -> WordsByState st fs b
WordsByDo s
s s
fs1
FL.Done b
b -> forall st fs b. b -> WordsByState st fs b -> WordsByState st fs b
WordsByYield b
b (forall st fs b. st -> WordsByState st fs b
WordsByInit s
s)
else do
Step s b
r <- s -> a -> m (Step s b)
fstep s
acc a
x
case Step s b
r of
FL.Partial s
fs1 -> SPEC -> s -> s -> m (Step (WordsByState s s b) b)
go SPEC
SPEC s
s s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b (forall st fs b. st -> WordsByState st fs b
WordsByInit s
s)
Skip s
s -> SPEC -> s -> s -> m (Step (WordsByState s s b) b)
go SPEC
SPEC s
s s
acc
Step s a
Stop -> s -> m b
done s
acc forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
r -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
r forall st fs b. WordsByState st fs b
WordsByDone
stepOuter State Stream m a
_ WordsByState s s b
WordsByDone = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
_ (WordsByYield b
b WordsByState s s b
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
b WordsByState s s b
next
{-# ANN type SplitOnSeqState Fuse #-}
data SplitOnSeqState rb rh ck w fs s b x =
SplitOnSeqInit
| SplitOnSeqYield b (SplitOnSeqState rb rh ck w fs s b x)
| SplitOnSeqDone
| SplitOnSeqEmpty !fs s
| SplitOnSeqSingle !fs s x
| SplitOnSeqWordInit !fs s
| SplitOnSeqWordLoop !w s !fs
| SplitOnSeqWordDone Int !fs !w
| SplitOnSeqKRInit Int !fs s rb !rh
| SplitOnSeqKRLoop fs s rb !rh !ck
| SplitOnSeqKRCheck fs s rb !rh
| SplitOnSeqKRDone Int !fs rb !rh
| SplitOnSeqReinit (fs -> SplitOnSeqState rb rh ck w fs s b x)
{-# INLINE_NORMAL splitOnSeq #-}
splitOnSeq
:: forall m a b. (MonadIO m, Storable a, Enum a, Eq a)
=> Array a
-> Fold m a b
-> Stream m a
-> Stream m b
splitOnSeq :: forall (m :: * -> *) a b.
(MonadIO m, Storable a, Enum a, Eq a) =>
Array a -> Fold m a b -> Stream m a -> Stream m b
splitOnSeq Array a
patArr (Fold s -> a -> m (Step s b)
fstep m (Step s b)
initial s -> m b
done) (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a
-> m (Step
(SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a) b)
stepOuter forall rb rh ck w fs s b x. SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqInit
where
patLen :: Int
patLen = forall a. Storable a => Array a -> Int
A.length Array a
patArr
maxIndex :: Int
maxIndex = Int
patLen forall a. Num a => a -> a -> a
- Int
1
elemBits :: Int
elemBits = SIZE_OF(a) * 8
wordMask :: Word
wordMask :: Word
wordMask = (Word
1 forall a. Bits a => a -> Int -> a
`shiftL` (Int
elemBits forall a. Num a => a -> a -> a
* Int
patLen)) forall a. Num a => a -> a -> a
- Word
1
elemMask :: Word
elemMask :: Word
elemMask = (Word
1 forall a. Bits a => a -> Int -> a
`shiftL` Int
elemBits) forall a. Num a => a -> a -> a
- Word
1
wordPat :: Word
wordPat :: Word
wordPat = Word
wordMask forall a. Bits a => a -> a -> a
.&. forall a b. Storable a => (b -> a -> b) -> b -> Array a -> b
A.foldl' forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
0 Array a
patArr
addToWord :: a -> a -> a
addToWord a
wd a
a = (a
wd forall a. Bits a => a -> Int -> a
`shiftL` Int
elemBits) forall a. Bits a => a -> a -> a
.|. forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Enum a => a -> Int
fromEnum a
a)
k :: Word32
k = Word32
2891336453 :: Word32
coeff :: Word32
coeff = Word32
k forall a b. (Num a, Integral b) => a -> b -> a
^ Int
patLen
addCksum :: Word32 -> a -> Word32
addCksum Word32
cksum a
a = Word32
cksum forall a. Num a => a -> a -> a
* Word32
k forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Enum a => a -> Int
fromEnum a
a)
deltaCksum :: Word32 -> a -> a -> Word32
deltaCksum Word32
cksum a
old a
new =
forall {a}. Enum a => Word32 -> a -> Word32
addCksum Word32
cksum a
new forall a. Num a => a -> a -> a
- Word32
coeff forall a. Num a => a -> a -> a
* forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Enum a => a -> Int
fromEnum a
old)
patHash :: Word32
patHash = forall a b. Storable a => (b -> a -> b) -> b -> Array a -> b
A.foldl' forall {a}. Enum a => Word32 -> a -> Word32
addCksum Word32
0 Array a
patArr
skip :: a -> m (Step a a)
skip = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. s -> Step s a
Skip
nextAfterInit :: (fs -> SplitOnSeqState rb rh ck w fs s b x)
-> Step fs b -> SplitOnSeqState rb rh ck w fs s b x
nextAfterInit fs -> SplitOnSeqState rb rh ck w fs s b x
nextGen Step fs b
stepRes =
case Step fs b
stepRes of
FL.Partial fs
s -> fs -> SplitOnSeqState rb rh ck w fs s b x
nextGen fs
s
FL.Done b
b -> forall rb rh ck w fs s b x.
b
-> SplitOnSeqState rb rh ck w fs s b x
-> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqYield b
b (forall rb rh ck w fs s b x.
(fs -> SplitOnSeqState rb rh ck w fs s b x)
-> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqReinit fs -> SplitOnSeqState rb rh ck w fs s b x
nextGen)
{-# INLINE yieldProceed #-}
yieldProceed :: (s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed s -> SplitOnSeqState rb rh ck w s s b x
nextGen b
fs =
m (Step s b)
initial forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {a} {a}. a -> m (Step a a)
skip forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall rb rh ck w fs s b x.
b
-> SplitOnSeqState rb rh ck w fs s b x
-> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqYield b
fs forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {fs} {rb} {rh} {ck} {w} {s} {b} {x}.
(fs -> SplitOnSeqState rb rh ck w fs s b x)
-> Step fs b -> SplitOnSeqState rb rh ck w fs s b x
nextAfterInit s -> SplitOnSeqState rb rh ck w s s b x
nextGen
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a
-> m (Step
(SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a) b)
stepOuter State Stream m a
_ SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a
SplitOnSeqInit = do
Step s b
res <- m (Step s b)
initial
case Step s b
res of
FL.Partial s
acc ->
if Int
patLen forall a. Eq a => a -> a -> Bool
== Int
0
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqEmpty s
acc s
state
else if Int
patLen forall a. Eq a => a -> a -> Bool
== Int
1
then do
a
pat <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Int -> Array a -> IO a
A.unsafeIndexIO Int
0 Array a
patArr
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> x -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqSingle s
acc s
state a
pat
else if SIZE_OF(a) * patLen
forall a. Ord a => a -> a -> Bool
<= forall a. Storable a => a -> Int
sizeOf (forall a. HasCallStack => a
undefined :: Word)
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqWordInit s
acc s
state
else do
(Ring a
rb, Ptr a
rhead) <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Int -> IO (Ring a, Ptr a)
RB.new Int
patLen
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> s -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRInit Int
0 s
acc s
state Ring a
rb Ptr a
rhead
FL.Done b
b -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSeqState rb rh ck w fs s b x
-> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqYield b
b forall rb rh ck w fs s b x. SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqInit
stepOuter State Stream m a
_ (SplitOnSeqYield b
x SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
x SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a
next
stepOuter State Stream m a
_ (SplitOnSeqReinit s -> SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a
nextGen) =
m (Step s b)
initial forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {a} {a}. a -> m (Step a a)
skip forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {fs} {rb} {rh} {ck} {w} {s} {b} {x}.
(fs -> SplitOnSeqState rb rh ck w fs s b x)
-> Step fs b -> SplitOnSeqState rb rh ck w fs s b x
nextAfterInit s -> SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a
nextGen
stepOuter State Stream m a
gst (SplitOnSeqEmpty s
acc s
st) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
Step s b
r <- s -> a -> m (Step s b)
fstep s
acc a
x
b
b1 <-
case Step s b
r of
FL.Partial s
acc1 -> s -> m b
done s
acc1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return b
b
let jump :: fs -> SplitOnSeqState rb rh ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqEmpty fs
c s
s
in forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSeqState rb rh ck w fs s b x
jump b
b1
Skip s
s -> forall {a} {a}. a -> m (Step a a)
skip (forall rb rh ck w fs s b x.
fs -> s -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqEmpty s
acc s
s)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
_ SplitOnSeqState (Ring a) (Ptr a) Word32 Word s s b a
SplitOnSeqDone = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
gst (SplitOnSeqSingle s
fs s
st a
pat) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
let jump :: fs -> SplitOnSeqState rb rh ck w fs s b a
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> x -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqSingle fs
c s
s a
pat
if a
pat forall a. Eq a => a -> a -> Bool
== a
x
then s -> m b
done s
fs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b}.
fs -> SplitOnSeqState rb rh ck w fs s b a
jump
else do
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs a
x
case Step s b
r of
FL.Partial s
fs1 -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall {fs} {rb} {rh} {ck} {w} {b}.
fs -> SplitOnSeqState rb rh ck w fs s b a
jump s
fs1
FL.Done b
b -> forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b}.
fs -> SplitOnSeqState rb rh ck w fs s b a
jump b
b
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> x -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqSingle s
fs s
s a
pat
Step s a
Stop -> do
b
r <- s -> m b
done s
fs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSeqState rb rh ck w fs s b x
-> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqYield b
r forall rb rh ck w fs s b x. SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqDone
stepOuter State Stream m a
_ (SplitOnSeqWordDone Int
0 s
fs Word
_) = do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSeqState rb rh ck w fs s b x
-> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqYield b
r forall rb rh ck w fs s b x. SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqDone
stepOuter State Stream m a
_ (SplitOnSeqWordDone Int
n s
fs Word
wrd) = do
let old :: Word
old = Word
elemMask forall a. Bits a => a -> a -> a
.&. (Word
wrd forall a. Bits a => a -> Int -> a
`shiftR` (Int
elemBits forall a. Num a => a -> a -> a
* (Int
n forall a. Num a => a -> a -> a
- Int
1)))
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs (forall a. Enum a => Int -> a
toEnum forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
old)
case Step s b
r of
FL.Partial s
fs1 -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> w -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqWordDone (Int
n forall a. Num a => a -> a -> a
- Int
1) s
fs1 Word
wrd
FL.Done b
b -> do
let jump :: fs -> SplitOnSeqState rb rh ck Word fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int -> fs -> w -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqWordDone (Int
n forall a. Num a => a -> a -> a
- Int
1) fs
c Word
wrd
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {s} {b} {x}.
fs -> SplitOnSeqState rb rh ck Word fs s b x
jump b
b
stepOuter State Stream m a
gst (SplitOnSeqWordInit s
fs s
st0) =
forall {rb} {rh} {ck} {x} {a}.
SPEC
-> Int
-> Word
-> s
-> m (Step (SplitOnSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Int
0 Word
0 s
st0
where
{-# INLINE go #-}
go :: SPEC
-> Int
-> Word
-> s
-> m (Step (SplitOnSeqState rb rh ck Word s s b x) a)
go !SPEC
_ !Int
idx !Word
wrd !s
st = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
let wrd1 :: Word
wrd1 = forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
wrd a
x
if Int
idx forall a. Eq a => a -> a -> Bool
== Int
maxIndex
then do
if Word
wrd1 forall a. Bits a => a -> a -> a
.&. Word
wordMask forall a. Eq a => a -> a -> Bool
== Word
wordPat
then do
let jump :: fs -> SplitOnSeqState rb rh ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqWordInit fs
c s
s
s -> m b
done s
fs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSeqState rb rh ck w fs s b x
jump
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
w -> s -> fs -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqWordLoop Word
wrd1 s
s s
fs
else SPEC
-> Int
-> Word
-> s
-> m (Step (SplitOnSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC (Int
idx forall a. Num a => a -> a -> a
+ Int
1) Word
wrd1 s
s
Skip s
s -> SPEC
-> Int
-> Word
-> s
-> m (Step (SplitOnSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Int
idx Word
wrd s
s
Step s a
Stop -> do
if Int
idx forall a. Eq a => a -> a -> Bool
/= Int
0
then forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> w -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqWordDone Int
idx s
fs Word
wrd
else do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSeqState rb rh ck w fs s b x
-> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqYield b
r forall rb rh ck w fs s b x. SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqDone
stepOuter State Stream m a
gst (SplitOnSeqWordLoop Word
wrd0 s
st0 s
fs0) =
forall {rb} {rh} {ck} {x} {a}.
SPEC
-> Word
-> s
-> s
-> m (Step (SplitOnSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Word
wrd0 s
st0 s
fs0
where
{-# INLINE go #-}
go :: SPEC
-> Word
-> s
-> s
-> m (Step (SplitOnSeqState rb rh ck Word s s b x) a)
go !SPEC
_ !Word
wrd !s
st !s
fs = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
let jump :: fs -> SplitOnSeqState rb rh ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqWordInit fs
c s
s
wrd1 :: Word
wrd1 = forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
wrd a
x
old :: Word
old = (Word
wordMask forall a. Bits a => a -> a -> a
.&. Word
wrd)
forall a. Bits a => a -> Int -> a
`shiftR` (Int
elemBits forall a. Num a => a -> a -> a
* (Int
patLen forall a. Num a => a -> a -> a
- Int
1))
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs (forall a. Enum a => Int -> a
toEnum forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
old)
case Step s b
r of
FL.Partial s
fs1 -> do
if Word
wrd1 forall a. Bits a => a -> a -> a
.&. Word
wordMask forall a. Eq a => a -> a -> Bool
== Word
wordPat
then s -> m b
done s
fs1 forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSeqState rb rh ck w fs s b x
jump
else SPEC
-> Word
-> s
-> s
-> m (Step (SplitOnSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Word
wrd1 s
s s
fs1
FL.Done b
b -> forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSeqState rb rh ck w fs s b x
jump b
b
Skip s
s -> SPEC
-> Word
-> s
-> s
-> m (Step (SplitOnSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Word
wrd s
s s
fs
Step s a
Stop -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> w -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqWordDone Int
patLen s
fs Word
wrd
stepOuter State Stream m a
gst (SplitOnSeqKRInit Int
idx s
fs s
st Ring a
rb Ptr a
rh) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
Ptr a
rh1 <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ring a -> Ptr a -> a -> IO (Ptr a)
RB.unsafeInsert Ring a
rb Ptr a
rh a
x
if Int
idx forall a. Eq a => a -> a -> Bool
== Int
maxIndex
then do
let fld :: (b -> a -> b) -> b -> Ring a -> b
fld = forall a b.
Storable a =>
Ptr a -> (b -> a -> b) -> b -> Ring a -> b
RB.unsafeFoldRing (forall a. Ring a -> Ptr a
RB.ringBound Ring a
rb)
let !ringHash :: Word32
ringHash = forall {b}. (b -> a -> b) -> b -> Ring a -> b
fld forall {a}. Enum a => Word32 -> a -> Word32
addCksum Word32
0 Ring a
rb
if Word32
ringHash forall a. Eq a => a -> a -> Bool
== Word32
patHash
then forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRCheck s
fs s
s Ring a
rb Ptr a
rh1
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> rb -> rh -> ck -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRLoop s
fs s
s Ring a
rb Ptr a
rh1 Word32
ringHash
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> s -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRInit (Int
idx forall a. Num a => a -> a -> a
+ Int
1) s
fs s
s Ring a
rb Ptr a
rh1
Skip s
s -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> s -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRInit Int
idx s
fs s
s Ring a
rb Ptr a
rh
Step s a
Stop -> do
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRDone Int
idx s
fs Ring a
rb (forall a. Ring a -> Ptr a
RB.startOf Ring a
rb)
stepOuter State Stream m a
gst (SplitOnSeqKRLoop s
fs0 s
st0 Ring a
rb Ptr a
rh0 Word32
cksum0) =
forall {ck} {w} {x} {a}.
SPEC
-> s
-> s
-> Ptr a
-> Word32
-> m (Step (SplitOnSeqState (Ring a) (Ptr a) ck w s s b x) a)
go SPEC
SPEC s
fs0 s
st0 Ptr a
rh0 Word32
cksum0
where
go :: SPEC
-> s
-> s
-> Ptr a
-> Word32
-> m (Step (SplitOnSeqState (Ring a) (Ptr a) ck w s s b x) a)
go !SPEC
_ !s
fs !s
st !Ptr a
rh !Word32
cksum = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
a
old <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> IO a
peek Ptr a
rh
let cksum1 :: Word32
cksum1 = forall {a} {a}. (Enum a, Enum a) => Word32 -> a -> a -> Word32
deltaCksum Word32
cksum a
old a
x
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs a
old
case Step s b
r of
FL.Partial s
fs1 -> do
Ptr a
rh1 <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (forall a. Storable a => Ring a -> Ptr a -> a -> IO (Ptr a)
RB.unsafeInsert Ring a
rb Ptr a
rh a
x)
if Word32
cksum1 forall a. Eq a => a -> a -> Bool
== Word32
patHash
then forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRCheck s
fs1 s
s Ring a
rb Ptr a
rh1
else SPEC
-> s
-> s
-> Ptr a
-> Word32
-> m (Step (SplitOnSeqState (Ring a) (Ptr a) ck w s s b x) a)
go SPEC
SPEC s
fs1 s
s Ptr a
rh1 Word32
cksum1
FL.Done b
b -> do
let rst :: Ptr a
rst = forall a. Ring a -> Ptr a
RB.startOf Ring a
rb
jump :: fs -> SplitOnSeqState (Ring a) (Ptr a) ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int -> fs -> s -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRInit Int
0 fs
c s
s Ring a
rb Ptr a
rst
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {ck} {w} {b} {x}.
fs -> SplitOnSeqState (Ring a) (Ptr a) ck w fs s b x
jump b
b
Skip s
s -> SPEC
-> s
-> s
-> Ptr a
-> Word32
-> m (Step (SplitOnSeqState (Ring a) (Ptr a) ck w s s b x) a)
go SPEC
SPEC s
fs s
s Ptr a
rh Word32
cksum
Step s a
Stop -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRDone Int
patLen s
fs Ring a
rb Ptr a
rh
stepOuter State Stream m a
_ (SplitOnSeqKRCheck s
fs s
st Ring a
rb Ptr a
rh) = do
if forall a. Ring a -> Ptr a -> Array a -> Bool
RB.unsafeEqArray Ring a
rb Ptr a
rh Array a
patArr
then do
b
r <- s -> m b
done s
fs
let rst :: Ptr a
rst = forall a. Ring a -> Ptr a
RB.startOf Ring a
rb
jump :: fs -> SplitOnSeqState (Ring a) (Ptr a) ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int -> fs -> s -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRInit Int
0 fs
c s
st Ring a
rb Ptr a
rst
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {ck} {w} {b} {x}.
fs -> SplitOnSeqState (Ring a) (Ptr a) ck w fs s b x
jump b
r
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> rb -> rh -> ck -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRLoop s
fs s
st Ring a
rb Ptr a
rh Word32
patHash
stepOuter State Stream m a
_ (SplitOnSeqKRDone Int
0 s
fs Ring a
_ Ptr a
_) = do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSeqState rb rh ck w fs s b x
-> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqYield b
r forall rb rh ck w fs s b x. SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqDone
stepOuter State Stream m a
_ (SplitOnSeqKRDone Int
n s
fs Ring a
rb Ptr a
rh) = do
a
old <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> IO a
peek Ptr a
rh
let rh1 :: Ptr a
rh1 = forall a. Storable a => Ring a -> Ptr a -> Ptr a
RB.advance Ring a
rb Ptr a
rh
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs a
old
case Step s b
r of
FL.Partial s
fs1 -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRDone (Int
n forall a. Num a => a -> a -> a
- Int
1) s
fs1 Ring a
rb Ptr a
rh1
FL.Done b
b -> do
let jump :: fs -> SplitOnSeqState (Ring a) (Ptr a) ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int -> fs -> rb -> rh -> SplitOnSeqState rb rh ck w fs s b x
SplitOnSeqKRDone (Int
n forall a. Num a => a -> a -> a
- Int
1) fs
c Ring a
rb Ptr a
rh1
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {ck} {w} {s} {b} {x}.
fs -> SplitOnSeqState (Ring a) (Ptr a) ck w fs s b x
jump b
b
{-# ANN type SplitOnSuffixSeqState Fuse #-}
data SplitOnSuffixSeqState rb rh ck w fs s b x =
SplitOnSuffixSeqInit
| SplitOnSuffixSeqYield b (SplitOnSuffixSeqState rb rh ck w fs s b x)
| SplitOnSuffixSeqDone
| SplitOnSuffixSeqEmpty !fs s
| SplitOnSuffixSeqSingleInit !fs s x
| SplitOnSuffixSeqSingle !fs s x
| SplitOnSuffixSeqWordInit !fs s
| SplitOnSuffixSeqWordLoop !w s !fs
| SplitOnSuffixSeqWordDone Int !fs !w
| SplitOnSuffixSeqKRInit Int !fs s rb !rh
| SplitOnSuffixSeqKRInit1 !fs s rb !rh
| SplitOnSuffixSeqKRLoop fs s rb !rh !ck
| SplitOnSuffixSeqKRCheck fs s rb !rh
| SplitOnSuffixSeqKRDone Int !fs rb !rh
| SplitOnSuffixSeqReinit
(fs -> SplitOnSuffixSeqState rb rh ck w fs s b x)
{-# INLINE_NORMAL splitOnSuffixSeq #-}
splitOnSuffixSeq
:: forall m a b. (MonadIO m, Storable a, Enum a, Eq a)
=> Bool
-> Array a
-> Fold m a b
-> Stream m a
-> Stream m b
splitOnSuffixSeq :: forall (m :: * -> *) a b.
(MonadIO m, Storable a, Enum a, Eq a) =>
Bool -> Array a -> Fold m a b -> Stream m a -> Stream m b
splitOnSuffixSeq Bool
withSep Array a
patArr (Fold s -> a -> m (Step s b)
fstep m (Step s b)
initial s -> m b
done) (Stream State Stream m a -> s -> m (Step s a)
step s
state) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream forall {m :: * -> *} {a}.
State Stream m a
-> SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a
-> m (Step
(SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a) b)
stepOuter forall rb rh ck w fs s b x.
SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqInit
where
patLen :: Int
patLen = forall a. Storable a => Array a -> Int
A.length Array a
patArr
maxIndex :: Int
maxIndex = Int
patLen forall a. Num a => a -> a -> a
- Int
1
elemBits :: Int
elemBits = SIZE_OF(a) * 8
wordMask :: Word
wordMask :: Word
wordMask = (Word
1 forall a. Bits a => a -> Int -> a
`shiftL` (Int
elemBits forall a. Num a => a -> a -> a
* Int
patLen)) forall a. Num a => a -> a -> a
- Word
1
elemMask :: Word
elemMask :: Word
elemMask = (Word
1 forall a. Bits a => a -> Int -> a
`shiftL` Int
elemBits) forall a. Num a => a -> a -> a
- Word
1
wordPat :: Word
wordPat :: Word
wordPat = Word
wordMask forall a. Bits a => a -> a -> a
.&. forall a b. Storable a => (b -> a -> b) -> b -> Array a -> b
A.foldl' forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
0 Array a
patArr
addToWord :: a -> a -> a
addToWord a
wd a
a = (a
wd forall a. Bits a => a -> Int -> a
`shiftL` Int
elemBits) forall a. Bits a => a -> a -> a
.|. forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Enum a => a -> Int
fromEnum a
a)
nextAfterInit :: (fs -> SplitOnSuffixSeqState rb rh ck w fs s b x)
-> Step fs b -> SplitOnSuffixSeqState rb rh ck w fs s b x
nextAfterInit fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
nextGen Step fs b
stepRes =
case Step fs b
stepRes of
FL.Partial fs
s -> fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
nextGen fs
s
FL.Done b
b ->
forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
b (forall rb rh ck w fs s b x.
(fs -> SplitOnSuffixSeqState rb rh ck w fs s b x)
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqReinit fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
nextGen)
{-# INLINE yieldProceed #-}
yieldProceed :: (s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed s -> SplitOnSuffixSeqState rb rh ck w s s b x
nextGen b
fs =
m (Step s b)
initial forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {a} {a}. a -> m (Step a a)
skip forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
fs forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {fs} {rb} {rh} {ck} {w} {s} {b} {x}.
(fs -> SplitOnSuffixSeqState rb rh ck w fs s b x)
-> Step fs b -> SplitOnSuffixSeqState rb rh ck w fs s b x
nextAfterInit s -> SplitOnSuffixSeqState rb rh ck w s s b x
nextGen
{-# INLINE processYieldSingle #-}
processYieldSingle :: a
-> a
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck w s s b a) a)
processYieldSingle a
pat a
x s
s s
fs = do
let jump :: fs -> SplitOnSuffixSeqState rb rh ck w fs s b a
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> x -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqSingleInit fs
c s
s a
pat
if a
pat forall a. Eq a => a -> a -> Bool
== a
x
then do
Step s b
r <- if Bool
withSep then s -> a -> m (Step s b)
fstep s
fs a
x else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
FL.Partial s
fs
b
b1 <-
case Step s b
r of
FL.Partial s
fs1 -> s -> m b
done s
fs1
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return b
b
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b}.
fs -> SplitOnSuffixSeqState rb rh ck w fs s b a
jump b
b1
else do
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs a
x
case Step s b
r of
FL.Partial s
fs1 -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> x -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqSingle s
fs1 s
s a
pat
FL.Done b
b -> forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b}.
fs -> SplitOnSuffixSeqState rb rh ck w fs s b a
jump b
b
k :: Word32
k = Word32
2891336453 :: Word32
coeff :: Word32
coeff = Word32
k forall a b. (Num a, Integral b) => a -> b -> a
^ Int
patLen
addCksum :: Word32 -> a -> Word32
addCksum Word32
cksum a
a = Word32
cksum forall a. Num a => a -> a -> a
* Word32
k forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Enum a => a -> Int
fromEnum a
a)
deltaCksum :: Word32 -> a -> a -> Word32
deltaCksum Word32
cksum a
old a
new =
forall {a}. Enum a => Word32 -> a -> Word32
addCksum Word32
cksum a
new forall a. Num a => a -> a -> a
- Word32
coeff forall a. Num a => a -> a -> a
* forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Enum a => a -> Int
fromEnum a
old)
patHash :: Word32
patHash = forall a b. Storable a => (b -> a -> b) -> b -> Array a -> b
A.foldl' forall {a}. Enum a => Word32 -> a -> Word32
addCksum Word32
0 Array a
patArr
skip :: a -> m (Step a a)
skip = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. s -> Step s a
Skip
{-# INLINE_LATE stepOuter #-}
stepOuter :: State Stream m a
-> SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a
-> m (Step
(SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a) b)
stepOuter State Stream m a
_ SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a
SplitOnSuffixSeqInit = do
Step s b
res <- m (Step s b)
initial
case Step s b
res of
FL.Partial s
fs ->
if Int
patLen forall a. Eq a => a -> a -> Bool
== Int
0
then forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqEmpty s
fs s
state
else if Int
patLen forall a. Eq a => a -> a -> Bool
== Int
1
then do
a
pat <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Int -> Array a -> IO a
A.unsafeIndexIO Int
0 Array a
patArr
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> x -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqSingleInit s
fs s
state a
pat
else if SIZE_OF(a) * patLen
forall a. Ord a => a -> a -> Bool
<= forall a. Storable a => a -> Int
sizeOf (forall a. HasCallStack => a
undefined :: Word)
then forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordInit s
fs s
state
else do
(Ring a
rb, Ptr a
rhead) <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Int -> IO (Ring a, Ptr a)
RB.new Int
patLen
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int
-> fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRInit Int
0 s
fs s
state Ring a
rb Ptr a
rhead
FL.Done b
fb -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
fb forall rb rh ck w fs s b x.
SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqInit
stepOuter State Stream m a
_ (SplitOnSuffixSeqYield b
x SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield b
x SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a
next
stepOuter State Stream m a
_ (SplitOnSuffixSeqReinit s -> SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a
nextGen) =
m (Step s b)
initial forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {a} {a}. a -> m (Step a a)
skip forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {fs} {rb} {rh} {ck} {w} {s} {b} {x}.
(fs -> SplitOnSuffixSeqState rb rh ck w fs s b x)
-> Step fs b -> SplitOnSuffixSeqState rb rh ck w fs s b x
nextAfterInit s -> SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a
nextGen
stepOuter State Stream m a
gst (SplitOnSuffixSeqEmpty s
acc s
st) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
let jump :: fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqEmpty fs
c s
s
Step s b
r <- s -> a -> m (Step s b)
fstep s
acc a
x
b
b1 <-
case Step s b
r of
FL.Partial s
fs -> s -> m b
done s
fs
FL.Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return b
b
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump b
b1
Skip s
s -> forall {a} {a}. a -> m (Step a a)
skip (forall rb rh ck w fs s b x.
fs -> s -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqEmpty s
acc s
s)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
_ SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 Word s s b a
SplitOnSuffixSeqDone = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
gst (SplitOnSuffixSeqSingleInit s
fs s
st a
pat) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> forall {s} {rb} {rh} {ck} {w} {a}.
a
-> a
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck w s s b a) a)
processYieldSingle a
pat a
x s
s s
fs
Skip s
s -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> x -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqSingleInit s
fs s
s a
pat
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
gst (SplitOnSuffixSeqSingle s
fs s
st a
pat) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> forall {s} {rb} {rh} {ck} {w} {a}.
a
-> a
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck w s s b a) a)
processYieldSingle a
pat a
x s
s s
fs
Skip s
s -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> x -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqSingle s
fs s
s a
pat
Step s a
Stop -> do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
r forall rb rh ck w fs s b x.
SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqDone
stepOuter State Stream m a
_ (SplitOnSuffixSeqWordDone Int
0 s
fs Word
_) = do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
r forall rb rh ck w fs s b x.
SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqDone
stepOuter State Stream m a
_ (SplitOnSuffixSeqWordDone Int
n s
fs Word
wrd) = do
let old :: Word
old = Word
elemMask forall a. Bits a => a -> a -> a
.&. (Word
wrd forall a. Bits a => a -> Int -> a
`shiftR` (Int
elemBits forall a. Num a => a -> a -> a
* (Int
n forall a. Num a => a -> a -> a
- Int
1)))
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs (forall a. Enum a => Int -> a
toEnum forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
old)
case Step s b
r of
FL.Partial s
fs1 -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> w -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordDone (Int
n forall a. Num a => a -> a -> a
- Int
1) s
fs1 Word
wrd
FL.Done b
b -> do
let jump :: fs -> SplitOnSuffixSeqState rb rh ck Word fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int -> fs -> w -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordDone (Int
n forall a. Num a => a -> a -> a
- Int
1) fs
c Word
wrd
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {s} {b} {x}.
fs -> SplitOnSuffixSeqState rb rh ck Word fs s b x
jump b
b
stepOuter State Stream m a
gst (SplitOnSuffixSeqWordInit s
fs0 s
st0) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st0
case Step s a
res of
Yield a
x s
s -> do
let wrd :: Word
wrd = forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
0 a
x
Step s b
r <- if Bool
withSep then s -> a -> m (Step s b)
fstep s
fs0 a
x else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
FL.Partial s
fs0
case Step s b
r of
FL.Partial s
fs1 -> forall {rb} {rh} {ck} {x} {a}.
SPEC
-> Int
-> Word
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Int
1 Word
wrd s
s s
fs1
FL.Done b
b -> do
let jump :: fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordInit fs
c s
s
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump b
b
Skip s
s -> forall {a} {a}. a -> m (Step a a)
skip (forall rb rh ck w fs s b x.
fs -> s -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordInit s
fs0 s
s)
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
where
{-# INLINE go #-}
go :: SPEC
-> Int
-> Word
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck Word s s b x) a)
go !SPEC
_ !Int
idx !Word
wrd !s
st !s
fs = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
let jump :: fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordInit fs
c s
s
let wrd1 :: Word
wrd1 = forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
wrd a
x
Step s b
r <- if Bool
withSep then s -> a -> m (Step s b)
fstep s
fs a
x else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
FL.Partial s
fs
case Step s b
r of
FL.Partial s
fs1 ->
if Int
idx forall a. Eq a => a -> a -> Bool
/= Int
maxIndex
then SPEC
-> Int
-> Word
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC (Int
idx forall a. Num a => a -> a -> a
+ Int
1) Word
wrd1 s
s s
fs1
else if Word
wrd1 forall a. Bits a => a -> a -> a
.&. Word
wordMask forall a. Eq a => a -> a -> Bool
/= Word
wordPat
then forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
w -> s -> fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordLoop Word
wrd1 s
s s
fs1
else do s -> m b
done s
fs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump
FL.Done b
b -> forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump b
b
Skip s
s -> SPEC
-> Int
-> Word
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Int
idx Word
wrd s
s s
fs
Step s a
Stop -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> w -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordDone Int
idx s
fs Word
wrd
stepOuter State Stream m a
gst (SplitOnSuffixSeqWordLoop Word
wrd0 s
st0 s
fs0) =
forall {rb} {rh} {ck} {x} {a}.
SPEC
-> Word
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Word
wrd0 s
st0 s
fs0
where
{-# INLINE go #-}
go :: SPEC
-> Word
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck Word s s b x) a)
go !SPEC
_ !Word
wrd !s
st !s
fs = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
let jump :: fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
fs -> s -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordInit fs
c s
s
wrd1 :: Word
wrd1 = forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
wrd a
x
old :: Word
old = (Word
wordMask forall a. Bits a => a -> a -> a
.&. Word
wrd)
forall a. Bits a => a -> Int -> a
`shiftR` (Int
elemBits forall a. Num a => a -> a -> a
* (Int
patLen forall a. Num a => a -> a -> a
- Int
1))
Step s b
r <-
if Bool
withSep
then s -> a -> m (Step s b)
fstep s
fs a
x
else s -> a -> m (Step s b)
fstep s
fs (forall a. Enum a => Int -> a
toEnum forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
old)
case Step s b
r of
FL.Partial s
fs1 ->
if Word
wrd1 forall a. Bits a => a -> a -> a
.&. Word
wordMask forall a. Eq a => a -> a -> Bool
== Word
wordPat
then s -> m b
done s
fs1 forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump
else SPEC
-> Word
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Word
wrd1 s
s s
fs1
FL.Done b
b -> forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {rb} {rh} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState rb rh ck w fs s b x
jump b
b
Skip s
s -> SPEC
-> Word
-> s
-> s
-> m (Step (SplitOnSuffixSeqState rb rh ck Word s s b x) a)
go SPEC
SPEC Word
wrd s
s s
fs
Step s a
Stop ->
if Word
wrd forall a. Bits a => a -> a -> a
.&. Word
wordMask forall a. Eq a => a -> a -> Bool
== Word
wordPat
then forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
else if Bool
withSep
then do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
r forall rb rh ck w fs s b x.
SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqDone
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> w -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqWordDone Int
patLen s
fs Word
wrd
stepOuter State Stream m a
gst (SplitOnSuffixSeqKRInit Int
idx0 s
fs s
st0 Ring a
rb Ptr a
rh0) = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st0
case Step s a
res of
Yield a
x s
s -> do
Ptr a
rh1 <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ring a -> Ptr a -> a -> IO (Ptr a)
RB.unsafeInsert Ring a
rb Ptr a
rh0 a
x
Step s b
r <- if Bool
withSep then s -> a -> m (Step s b)
fstep s
fs a
x else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
FL.Partial s
fs
case Step s b
r of
FL.Partial s
fs1 ->
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRInit1 s
fs1 s
s Ring a
rb Ptr a
rh1
FL.Done b
b -> do
let rst :: Ptr a
rst = forall a. Ring a -> Ptr a
RB.startOf Ring a
rb
jump :: fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int
-> fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRInit Int
0 fs
c s
s Ring a
rb Ptr a
rst
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump b
b
Skip s
s -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int
-> fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRInit Int
idx0 s
fs s
s Ring a
rb Ptr a
rh0
Step s a
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
stepOuter State Stream m a
gst (SplitOnSuffixSeqKRInit1 s
fs0 s
st0 Ring a
rb Ptr a
rh0) = do
forall {w} {x} {a}.
SPEC
-> Int
-> Ptr a
-> s
-> s
-> m (Step
(SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 w s s b x) a)
go SPEC
SPEC Int
1 Ptr a
rh0 s
st0 s
fs0
where
go :: SPEC
-> Int
-> Ptr a
-> s
-> s
-> m (Step
(SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 w s s b x) a)
go !SPEC
_ !Int
idx !Ptr a
rh s
st !s
fs = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
Ptr a
rh1 <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (forall a. Storable a => Ring a -> Ptr a -> a -> IO (Ptr a)
RB.unsafeInsert Ring a
rb Ptr a
rh a
x)
Step s b
r <- if Bool
withSep then s -> a -> m (Step s b)
fstep s
fs a
x else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
FL.Partial s
fs
case Step s b
r of
FL.Partial s
fs1 ->
if Int
idx forall a. Eq a => a -> a -> Bool
/= Int
maxIndex
then SPEC
-> Int
-> Ptr a
-> s
-> s
-> m (Step
(SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 w s s b x) a)
go SPEC
SPEC (Int
idx forall a. Num a => a -> a -> a
+ Int
1) Ptr a
rh1 s
s s
fs1
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$
let fld :: (b -> a -> b) -> b -> Ring a -> b
fld = forall a b.
Storable a =>
Ptr a -> (b -> a -> b) -> b -> Ring a -> b
RB.unsafeFoldRing (forall a. Ring a -> Ptr a
RB.ringBound Ring a
rb)
!ringHash :: Word32
ringHash = forall {b}. (b -> a -> b) -> b -> Ring a -> b
fld forall {a}. Enum a => Word32 -> a -> Word32
addCksum Word32
0 Ring a
rb
in if Word32
ringHash forall a. Eq a => a -> a -> Bool
== Word32
patHash
then forall rb rh ck w fs s b x.
fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRCheck s
fs1 s
s Ring a
rb Ptr a
rh1
else forall rb rh ck w fs s b x.
fs
-> s -> rb -> rh -> ck -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRLoop
s
fs1 s
s Ring a
rb Ptr a
rh1 Word32
ringHash
FL.Done b
b -> do
let rst :: Ptr a
rst = forall a. Ring a -> Ptr a
RB.startOf Ring a
rb
jump :: fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int
-> fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRInit Int
0 fs
c s
s Ring a
rb Ptr a
rst
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump b
b
Skip s
s -> SPEC
-> Int
-> Ptr a
-> s
-> s
-> m (Step
(SplitOnSuffixSeqState (Ring a) (Ptr a) Word32 w s s b x) a)
go SPEC
SPEC Int
idx Ptr a
rh s
s s
fs
Step s a
Stop -> do
if (Int
idx forall a. Eq a => a -> a -> Bool
== Int
maxIndex) Bool -> Bool -> Bool
&& forall a. Ring a -> Ptr a -> Array a -> Bool
RB.unsafeEqArray Ring a
rb Ptr a
rh Array a
patArr
then forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
else if Bool
withSep
then do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
r forall rb rh ck w fs s b x.
SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqDone
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRDone Int
idx s
fs Ring a
rb (forall a. Ring a -> Ptr a
RB.startOf Ring a
rb)
stepOuter State Stream m a
gst (SplitOnSuffixSeqKRLoop s
fs0 s
st0 Ring a
rb Ptr a
rh0 Word32
cksum0) =
forall {ck} {w} {x} {a}.
SPEC
-> s
-> s
-> Ptr a
-> Word32
-> m (Step (SplitOnSuffixSeqState (Ring a) (Ptr a) ck w s s b x) a)
go SPEC
SPEC s
fs0 s
st0 Ptr a
rh0 Word32
cksum0
where
go :: SPEC
-> s
-> s
-> Ptr a
-> Word32
-> m (Step (SplitOnSuffixSeqState (Ring a) (Ptr a) ck w s s b x) a)
go !SPEC
_ !s
fs !s
st !Ptr a
rh !Word32
cksum = do
Step s a
res <- State Stream m a -> s -> m (Step s a)
step (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s a
res of
Yield a
x s
s -> do
a
old <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> IO a
peek Ptr a
rh
Ptr a
rh1 <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (forall a. Storable a => Ring a -> Ptr a -> a -> IO (Ptr a)
RB.unsafeInsert Ring a
rb Ptr a
rh a
x)
let cksum1 :: Word32
cksum1 = forall {a} {a}. (Enum a, Enum a) => Word32 -> a -> a -> Word32
deltaCksum Word32
cksum a
old a
x
Step s b
r <- if Bool
withSep then s -> a -> m (Step s b)
fstep s
fs a
x else s -> a -> m (Step s b)
fstep s
fs a
old
case Step s b
r of
FL.Partial s
fs1 ->
if Word32
cksum1 forall a. Eq a => a -> a -> Bool
/= Word32
patHash
then SPEC
-> s
-> s
-> Ptr a
-> Word32
-> m (Step (SplitOnSuffixSeqState (Ring a) (Ptr a) ck w s s b x) a)
go SPEC
SPEC s
fs1 s
s Ptr a
rh1 Word32
cksum1
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRCheck s
fs1 s
s Ring a
rb Ptr a
rh1
FL.Done b
b -> do
let rst :: Ptr a
rst = forall a. Ring a -> Ptr a
RB.startOf Ring a
rb
jump :: fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int
-> fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRInit Int
0 fs
c s
s Ring a
rb Ptr a
rst
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump b
b
Skip s
s -> SPEC
-> s
-> s
-> Ptr a
-> Word32
-> m (Step (SplitOnSuffixSeqState (Ring a) (Ptr a) ck w s s b x) a)
go SPEC
SPEC s
fs s
s Ptr a
rh Word32
cksum
Step s a
Stop ->
if forall a. Ring a -> Ptr a -> Array a -> Bool
RB.unsafeEqArray Ring a
rb Ptr a
rh Array a
patArr
then forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
else if Bool
withSep
then do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
r forall rb rh ck w fs s b x.
SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqDone
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRDone Int
patLen s
fs Ring a
rb Ptr a
rh
stepOuter State Stream m a
_ (SplitOnSuffixSeqKRCheck s
fs s
st Ring a
rb Ptr a
rh) = do
if forall a. Ring a -> Ptr a -> Array a -> Bool
RB.unsafeEqArray Ring a
rb Ptr a
rh Array a
patArr
then do
b
r <- s -> m b
done s
fs
let rst :: Ptr a
rst = forall a. Ring a -> Ptr a
RB.startOf Ring a
rb
jump :: fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int
-> fs -> s -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRInit Int
0 fs
c s
st Ring a
rb Ptr a
rst
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {ck} {w} {b} {x}.
fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump b
r
else forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
fs
-> s -> rb -> rh -> ck -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRLoop s
fs s
st Ring a
rb Ptr a
rh Word32
patHash
stepOuter State Stream m a
_ (SplitOnSuffixSeqKRDone Int
0 s
fs Ring a
_ Ptr a
_) = do
b
r <- s -> m b
done s
fs
forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
b
-> SplitOnSuffixSeqState rb rh ck w fs s b x
-> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqYield b
r forall rb rh ck w fs s b x.
SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqDone
stepOuter State Stream m a
_ (SplitOnSuffixSeqKRDone Int
n s
fs Ring a
rb Ptr a
rh) = do
a
old <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> IO a
peek Ptr a
rh
let rh1 :: Ptr a
rh1 = forall a. Storable a => Ring a -> Ptr a -> Ptr a
RB.advance Ring a
rb Ptr a
rh
Step s b
r <- s -> a -> m (Step s b)
fstep s
fs a
old
case Step s b
r of
FL.Partial s
fs1 -> forall {a} {a}. a -> m (Step a a)
skip forall a b. (a -> b) -> a -> b
$ forall rb rh ck w fs s b x.
Int -> fs -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRDone (Int
n forall a. Num a => a -> a -> a
- Int
1) s
fs1 Ring a
rb Ptr a
rh1
FL.Done b
b -> do
let jump :: fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump fs
c = forall rb rh ck w fs s b x.
Int -> fs -> rb -> rh -> SplitOnSuffixSeqState rb rh ck w fs s b x
SplitOnSuffixSeqKRDone (Int
n forall a. Num a => a -> a -> a
- Int
1) fs
c Ring a
rb Ptr a
rh1
forall {rb} {rh} {ck} {w} {s} {x} {a}.
(s -> SplitOnSuffixSeqState rb rh ck w s s b x)
-> b -> m (Step (SplitOnSuffixSeqState rb rh ck w s s b x) a)
yieldProceed forall {fs} {ck} {w} {s} {b} {x}.
fs -> SplitOnSuffixSeqState (Ring a) (Ptr a) ck w fs s b x
jump b
b
{-# ANN type SplitState Fuse #-}
data SplitState s arr
= SplitInitial s
| SplitBuffering s arr
| SplitSplitting s arr
| SplitYielding arr (SplitState s arr)
| SplitFinishing
{-# INLINE_NORMAL splitInnerBy #-}
splitInnerBy
:: Monad m
=> (f a -> m (f a, Maybe (f a)))
-> (f a -> f a -> m (f a))
-> Stream m (f a)
-> Stream m (f a)
splitInnerBy :: forall (m :: * -> *) (f :: * -> *) a.
Monad m =>
(f a -> m (f a, Maybe (f a)))
-> (f a -> f a -> m (f a)) -> Stream m (f a) -> Stream m (f a)
splitInnerBy f a -> m (f a, Maybe (f a))
splitter f a -> f a -> m (f a)
joiner (Stream State Stream m (f a) -> s -> m (Step s (f a))
step1 s
state1) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m (f a)
-> SplitState s (f a) -> m (Step (SplitState s (f a)) (f a))
step (forall s arr. s -> SplitState s arr
SplitInitial s
state1)
where
{-# INLINE_LATE step #-}
step :: State Stream m (f a)
-> SplitState s (f a) -> m (Step (SplitState s (f a)) (f a))
step State Stream m (f a)
gst (SplitInitial s
st) = do
Step s (f a)
r <- State Stream m (f a) -> s -> m (Step s (f a))
step1 State Stream m (f a)
gst s
st
case Step s (f a)
r of
Yield f a
x s
s -> do
(f a
x1, Maybe (f a)
mx2) <- f a -> m (f a, Maybe (f a))
splitter f a
x
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe (f a)
mx2 of
Maybe (f a)
Nothing -> forall s a. s -> Step s a
Skip (forall s arr. s -> arr -> SplitState s arr
SplitBuffering s
s f a
x1)
Just f a
x2 -> forall s a. s -> Step s a
Skip (forall s arr. arr -> SplitState s arr -> SplitState s arr
SplitYielding f a
x1 (forall s arr. s -> arr -> SplitState s arr
SplitSplitting s
s f a
x2))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s arr. s -> SplitState s arr
SplitInitial s
s)
Step s (f a)
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m (f a)
gst (SplitBuffering s
st f a
buf) = do
Step s (f a)
r <- State Stream m (f a) -> s -> m (Step s (f a))
step1 State Stream m (f a)
gst s
st
case Step s (f a)
r of
Yield f a
x s
s -> do
(f a
x1, Maybe (f a)
mx2) <- f a -> m (f a, Maybe (f a))
splitter f a
x
f a
buf' <- f a -> f a -> m (f a)
joiner f a
buf f a
x1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe (f a)
mx2 of
Maybe (f a)
Nothing -> forall s a. s -> Step s a
Skip (forall s arr. s -> arr -> SplitState s arr
SplitBuffering s
s f a
buf')
Just f a
x2 -> forall s a. s -> Step s a
Skip (forall s arr. arr -> SplitState s arr -> SplitState s arr
SplitYielding f a
buf' (forall s arr. s -> arr -> SplitState s arr
SplitSplitting s
s f a
x2))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s arr. s -> arr -> SplitState s arr
SplitBuffering s
s f a
buf)
Step s (f a)
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s arr. arr -> SplitState s arr -> SplitState s arr
SplitYielding f a
buf forall s arr. SplitState s arr
SplitFinishing)
step State Stream m (f a)
_ (SplitSplitting s
st f a
buf) = do
(f a
x1, Maybe (f a)
mx2) <- f a -> m (f a, Maybe (f a))
splitter f a
buf
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe (f a)
mx2 of
Maybe (f a)
Nothing -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall s arr. s -> arr -> SplitState s arr
SplitBuffering s
st f a
x1
Just f a
x2 -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall s arr. arr -> SplitState s arr -> SplitState s arr
SplitYielding f a
x1 (forall s arr. s -> arr -> SplitState s arr
SplitSplitting s
st f a
x2)
step State Stream m (f a)
_ (SplitYielding f a
x SplitState s (f a)
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield f a
x SplitState s (f a)
next
step State Stream m (f a)
_ SplitState s (f a)
SplitFinishing = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
{-# INLINE_NORMAL splitInnerBySuffix #-}
splitInnerBySuffix
:: (Monad m, Eq (f a), Monoid (f a))
=> (f a -> m (f a, Maybe (f a)))
-> (f a -> f a -> m (f a))
-> Stream m (f a)
-> Stream m (f a)
splitInnerBySuffix :: forall (m :: * -> *) (f :: * -> *) a.
(Monad m, Eq (f a), Monoid (f a)) =>
(f a -> m (f a, Maybe (f a)))
-> (f a -> f a -> m (f a)) -> Stream m (f a) -> Stream m (f a)
splitInnerBySuffix f a -> m (f a, Maybe (f a))
splitter f a -> f a -> m (f a)
joiner (Stream State Stream m (f a) -> s -> m (Step s (f a))
step1 s
state1) =
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m (f a)
-> SplitState s (f a) -> m (Step (SplitState s (f a)) (f a))
step (forall s arr. s -> SplitState s arr
SplitInitial s
state1)
where
{-# INLINE_LATE step #-}
step :: State Stream m (f a)
-> SplitState s (f a) -> m (Step (SplitState s (f a)) (f a))
step State Stream m (f a)
gst (SplitInitial s
st) = do
Step s (f a)
r <- State Stream m (f a) -> s -> m (Step s (f a))
step1 State Stream m (f a)
gst s
st
case Step s (f a)
r of
Yield f a
x s
s -> do
(f a
x1, Maybe (f a)
mx2) <- f a -> m (f a, Maybe (f a))
splitter f a
x
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe (f a)
mx2 of
Maybe (f a)
Nothing -> forall s a. s -> Step s a
Skip (forall s arr. s -> arr -> SplitState s arr
SplitBuffering s
s f a
x1)
Just f a
x2 -> forall s a. s -> Step s a
Skip (forall s arr. arr -> SplitState s arr -> SplitState s arr
SplitYielding f a
x1 (forall s arr. s -> arr -> SplitState s arr
SplitSplitting s
s f a
x2))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s arr. s -> SplitState s arr
SplitInitial s
s)
Step s (f a)
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop
step State Stream m (f a)
gst (SplitBuffering s
st f a
buf) = do
Step s (f a)
r <- State Stream m (f a) -> s -> m (Step s (f a))
step1 State Stream m (f a)
gst s
st
case Step s (f a)
r of
Yield f a
x s
s -> do
(f a
x1, Maybe (f a)
mx2) <- f a -> m (f a, Maybe (f a))
splitter f a
x
f a
buf' <- f a -> f a -> m (f a)
joiner f a
buf f a
x1
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe (f a)
mx2 of
Maybe (f a)
Nothing -> forall s a. s -> Step s a
Skip (forall s arr. s -> arr -> SplitState s arr
SplitBuffering s
s f a
buf')
Just f a
x2 -> forall s a. s -> Step s a
Skip (forall s arr. arr -> SplitState s arr -> SplitState s arr
SplitYielding f a
buf' (forall s arr. s -> arr -> SplitState s arr
SplitSplitting s
s f a
x2))
Skip s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. s -> Step s a
Skip (forall s arr. s -> arr -> SplitState s arr
SplitBuffering s
s f a
buf)
Step s (f a)
Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$
if f a
buf forall a. Eq a => a -> a -> Bool
== forall a. Monoid a => a
mempty
then forall s a. Step s a
Stop
else forall s a. s -> Step s a
Skip (forall s arr. arr -> SplitState s arr -> SplitState s arr
SplitYielding f a
buf forall s arr. SplitState s arr
SplitFinishing)
step State Stream m (f a)
_ (SplitSplitting s
st f a
buf) = do
(f a
x1, Maybe (f a)
mx2) <- f a -> m (f a, Maybe (f a))
splitter f a
buf
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe (f a)
mx2 of
Maybe (f a)
Nothing -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall s arr. s -> arr -> SplitState s arr
SplitBuffering s
st f a
x1
Just f a
x2 -> forall s a. s -> Step s a
Skip forall a b. (a -> b) -> a -> b
$ forall s arr. arr -> SplitState s arr -> SplitState s arr
SplitYielding f a
x1 (forall s arr. s -> arr -> SplitState s arr
SplitSplitting s
st f a
x2)
step State Stream m (f a)
_ (SplitYielding f a
x SplitState s (f a)
next) = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s a. a -> s -> Step s a
Yield f a
x SplitState s (f a)
next
step State Stream m (f a)
_ SplitState s (f a)
SplitFinishing = forall (m :: * -> *) a. Monad m => a -> m a
return forall s a. Step s a
Stop