{-# LANGUAGE CPP #-}
module Streamly.Internal.Data.Fold
(
Step (..)
, Fold (..)
, Tee (..)
, foldl'
, foldlM'
, foldl1'
, foldlM1'
, foldt'
, foldtM'
, foldr'
, foldrM'
, tracing
, trace
, sconcat
, mconcat
, foldMap
, foldMapM
, drain
, drainMapM
, the
, length
, lengthGeneric
, mean
, rollingHash
, defaultSalt
, rollingHashWithSalt
, rollingHashFirstN
, sum
, product
, maximumBy
, maximum
, minimumBy
, minimum
, toList
, toListRev
, toStream
, toStreamRev
, toStreamK
, toStreamKRev
, topBy
, top
, bottomBy
, bottom
, latest
, indexingWith
, indexing
, indexingRev
, rollingMapM
, filtering
, deleteBy
, uniqBy
, uniq
, repeated
, findIndices
, elemIndices
, fromPure
, fromEffect
, fromRefold
, one
, null
, satisfy
, maybe
, drainN
, indexGeneric
, index
, findM
, find
, lookup
, findIndex
, elemIndex
, elem
, notElem
, all
, any
, and
, or
, taking
, dropping
, takingEndByM
, takingEndBy
, takingEndByM_
, takingEndBy_
, droppingWhileM
, droppingWhile
, prune
, drive
, extractM
, reduce
, close
, isClosed
, snoc
, snocl
, snocM
, snoclM
, addOne
, addStream
, with
, morphInner
, generalizeInner
, rmapM
, transform
, lmap
, lmapM
, slide2
, scan
, scanMany
, postscan
, indexed
, zipStreamWithM
, zipStream
, catMaybes
, mapMaybeM
, mapMaybe
, scanMaybe
, filter
, filterM
, sampleFromthen
, catLefts
, catRights
, catEithers
, take
, takeEndBy
, takeEndBy_
, takeEndBySeq
, takeEndBySeq_
, splitWith
, split_
, splitAt
, teeWith
, tee
, teeWithFst
, teeWithMin
, distribute
, unzip
, unzipWith
, unzipWithM
, unzipWithFstM
, unzipWithMinM
, shortest
, longest
, partitionByM
, partitionByFstM
, partitionByMinM
, partitionBy
, partition
, many
, manyPost
, groupsOf
, chunksBetween
, refoldMany
, refoldMany1
, intersperseWithQuotes
, unfoldMany
, concatSequence
, concatMap
, duplicate
, refold
, foldr
, drainBy
, last
, head
, sequence
, mapM
, variance
, stdDev
, serialWith
)
where
#include "inline.hs"
#include "ArrayMacros.h"
import Control.Monad (void)
import Control.Monad.IO.Class (MonadIO(..))
import Data.Bifunctor (first)
import Data.Bits (shiftL, shiftR, (.|.), (.&.))
import Data.Either (isLeft, isRight, fromLeft, fromRight)
import Data.Int (Int64)
import Data.Proxy (Proxy(..))
import Data.Word (Word32)
import Foreign.Storable (Storable, peek)
import Streamly.Internal.Data.Array.Mut.Type (MutArray(..))
import Streamly.Internal.Data.Maybe.Strict (Maybe'(..), toMaybe)
import Streamly.Internal.Data.Pipe.Type (Pipe (..), PipeState(..))
import Streamly.Internal.Data.Unboxed (Unbox, sizeOf)
import Streamly.Internal.Data.Unfold.Type (Unfold(..))
import Streamly.Internal.Data.Tuple.Strict (Tuple'(..), Tuple3'(..))
import Streamly.Internal.Data.Stream.StreamD.Type (Stream)
import qualified Prelude
import qualified Streamly.Internal.Data.Array.Mut.Type as MA
import qualified Streamly.Internal.Data.Array.Type as Array
import qualified Streamly.Internal.Data.Fold.Window as FoldW
import qualified Streamly.Internal.Data.Pipe.Type as Pipe
import qualified Streamly.Internal.Data.Ring.Unboxed as Ring
import qualified Streamly.Internal.Data.Stream.StreamD.Type as StreamD
import Prelude hiding
( filter, foldl1, drop, dropWhile, take, takeWhile, zipWith
, foldl, foldr, map, mapM_, sequence, all, any, sum, product, elem
, notElem, maximum, minimum, head, last, tail, length, null
, reverse, iterate, init, and, or, lookup, (!!)
, scanl, scanl1, replicate, concatMap, mconcat, foldMap, unzip
, span, splitAt, break, mapM, zip, maybe)
import Streamly.Internal.Data.Fold.Type
import Streamly.Internal.Data.Fold.Tee
#include "DocTestDataFold.hs"
{-# INLINE drive #-}
drive :: Monad m => Stream m a -> Fold m a b -> m b
drive :: forall (m :: * -> *) a b.
Monad m =>
Stream m a -> Fold m a b -> m b
drive = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Stream m a -> m b
StreamD.fold
addStream :: Monad m => Stream m a -> Fold m a b -> m (Fold m a b)
addStream :: forall (m :: * -> *) a b.
Monad m =>
Stream m a -> Fold m a b -> m (Fold m a b)
addStream Stream m a
stream = forall (m :: * -> *) a b.
Monad m =>
Stream m a -> Fold m a b -> m b
drive Stream m a
stream forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Fold m a (Fold m a b)
duplicate
{-# DEPRECATED sequence "Use \"rmapM id\" instead" #-}
{-# INLINE sequence #-}
sequence :: Monad m => Fold m a (m b) -> Fold m a b
sequence :: forall (m :: * -> *) a b. Monad m => Fold m a (m b) -> Fold m a b
sequence = forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> Fold m a b -> Fold m a c
rmapM forall a. a -> a
id
{-# DEPRECATED mapM "Use rmapM instead" #-}
{-# INLINE mapM #-}
mapM :: Monad m => (b -> m c) -> Fold m a b -> Fold m a c
mapM :: forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> Fold m a b -> Fold m a c
mapM = forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> Fold m a b -> Fold m a c
rmapM
{-# INLINE mapMaybeM #-}
mapMaybeM :: Monad m => (a -> m (Maybe b)) -> Fold m b r -> Fold m a r
mapMaybeM :: forall (m :: * -> *) a b r.
Monad m =>
(a -> m (Maybe b)) -> Fold m b r -> Fold m a r
mapMaybeM a -> m (Maybe b)
f = forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Fold m b r -> Fold m a r
lmapM a -> m (Maybe b)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Fold m (Maybe a) b
catMaybes
{-# INLINE mapMaybe #-}
mapMaybe :: Monad m => (a -> Maybe b) -> Fold m b r -> Fold m a r
mapMaybe :: forall (m :: * -> *) a b r.
Monad m =>
(a -> Maybe b) -> Fold m b r -> Fold m a r
mapMaybe a -> Maybe b
f = forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap a -> Maybe b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Fold m (Maybe a) b
catMaybes
{-# INLINE tracing #-}
tracing :: Monad m => (a -> m b) -> (a -> m a)
tracing :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> a -> m a
tracing a -> m b
f a
x = forall (f :: * -> *) a. Functor f => f a -> f ()
void (a -> m b
f a
x) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return a
x
{-# INLINE trace #-}
trace :: Monad m => (a -> m b) -> Fold m a r -> Fold m a r
trace :: forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Fold m a r -> Fold m a r
trace a -> m b
f = forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Fold m b r -> Fold m a r
lmapM (forall (m :: * -> *) a b. Monad m => (a -> m b) -> a -> m a
tracing a -> m b
f)
{-# INLINE transform #-}
transform :: Monad m => Pipe m a b -> Fold m b c -> Fold m a c
transform :: forall (m :: * -> *) a b c.
Monad m =>
Pipe m a b -> Fold m b c -> Fold m a c
transform (Pipe s1 -> a -> m (Step (PipeState s1 s2) b)
pstep1 s2 -> m (Step (PipeState s1 s2) b)
pstep2 s1
pinitial) (Fold s -> b -> m (Step s c)
fstep m (Step s c)
finitial s -> m c
fextract) =
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold Tuple' s1 s -> a -> m (Step (Tuple' s1 s) c)
step m (Step (Tuple' s1 s) c)
initial forall {a}. Tuple' a s -> m c
extract
where
initial :: m (Step (Tuple' s1 s) c)
initial = forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (forall a b. a -> b -> Tuple' a b
Tuple' s1
pinitial) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Step s c)
finitial
step :: Tuple' s1 s -> a -> m (Step (Tuple' s1 s) c)
step (Tuple' s1
ps s
fs) a
x = do
Step (PipeState s1 s2) b
r <- s1 -> a -> m (Step (PipeState s1 s2) b)
pstep1 s1
ps a
x
s -> Step (PipeState s1 s2) b -> m (Step (Tuple' s1 s) c)
go s
fs Step (PipeState s1 s2) b
r
where
go :: s -> Step (PipeState s1 s2) b -> m (Step (Tuple' s1 s) c)
go s
acc (Pipe.Yield b
b (Consume s1
ps')) = do
Step s c
acc' <- s -> b -> m (Step s c)
fstep s
acc b
b
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ case Step s c
acc' 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' s1
ps' s
s
Done c
b2 -> forall s b. b -> Step s b
Done c
b2
go s
acc (Pipe.Yield b
b (Produce s2
ps')) = do
Step s c
acc' <- s -> b -> m (Step s c)
fstep s
acc b
b
Step (PipeState s1 s2) b
r <- s2 -> m (Step (PipeState s1 s2) b)
pstep2 s2
ps'
case Step s c
acc' of
Partial s
s -> s -> Step (PipeState s1 s2) b -> m (Step (Tuple' s1 s) c)
go s
s Step (PipeState s1 s2) b
r
Done c
b2 -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done c
b2
go s
acc (Pipe.Continue (Consume s1
ps')) =
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> Tuple' a b
Tuple' s1
ps' s
acc
go s
acc (Pipe.Continue (Produce s2
ps')) = do
Step (PipeState s1 s2) b
r <- s2 -> m (Step (PipeState s1 s2) b)
pstep2 s2
ps'
s -> Step (PipeState s1 s2) b -> m (Step (Tuple' s1 s) c)
go s
acc Step (PipeState s1 s2) b
r
extract :: Tuple' a s -> m c
extract (Tuple' a
_ s
fs) = s -> m c
fextract s
fs
{-# INLINE scanWith #-}
scanWith :: Monad m => Bool -> Fold m a b -> Fold m b c -> Fold m a c
scanWith :: forall (m :: * -> *) a b c.
Monad m =>
Bool -> Fold m a b -> Fold m b c -> Fold m a c
scanWith Bool
isMany (Fold s -> a -> m (Step s b)
stepL m (Step s b)
initialL s -> m b
extractL) (Fold s -> b -> m (Step s c)
stepR m (Step s c)
initialR s -> m c
extractR) =
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold (s, s) -> a -> m (Step (s, s) c)
step m (Step (s, s) c)
initial forall {a}. (a, s) -> m c
extract
where
{-# INLINE runStep #-}
runStep :: m (Step s b) -> s -> m (Step (s, s) c)
runStep m (Step s b)
actionL s
sR = do
Step s b
rL <- m (Step s b)
actionL
case Step s b
rL of
Done b
bL -> do
Step s c
rR <- s -> b -> m (Step s c)
stepR s
sR b
bL
case Step s c
rR of
Partial s
sR1 ->
if Bool
isMany
then m (Step s b) -> s -> m (Step (s, s) c)
runStep m (Step s b)
initialL s
sR1
else forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m c
extractR s
sR1
Done c
bR -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done c
bR
Partial s
sL -> do
!b
b <- s -> m b
extractL s
sL
Step s c
rR <- s -> b -> m (Step s c)
stepR s
sR b
b
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ case Step s c
rR of
Partial s
sR1 -> forall s b. s -> Step s b
Partial (s
sL, s
sR1)
Done c
bR -> forall s b. b -> Step s b
Done c
bR
initial :: m (Step (s, s) c)
initial = do
Step s c
r <- m (Step s c)
initialR
case Step s c
r of
Partial s
sR -> m (Step s b) -> s -> m (Step (s, s) c)
runStep m (Step s b)
initialL s
sR
Done c
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done c
b
step :: (s, s) -> a -> m (Step (s, s) c)
step (s
sL, s
sR) a
x = m (Step s b) -> s -> m (Step (s, s) c)
runStep (s -> a -> m (Step s b)
stepL s
sL a
x) s
sR
extract :: (a, s) -> m c
extract = s -> m c
extractR forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd
{-# INLINE scan #-}
scan :: Monad m => Fold m a b -> Fold m b c -> Fold m a c
scan :: forall (m :: * -> *) a b c.
Monad m =>
Fold m a b -> Fold m b c -> Fold m a c
scan = forall (m :: * -> *) a b c.
Monad m =>
Bool -> Fold m a b -> Fold m b c -> Fold m a c
scanWith Bool
False
{-# INLINE scanMany #-}
scanMany :: Monad m => Fold m a b -> Fold m b c -> Fold m a c
scanMany :: forall (m :: * -> *) a b c.
Monad m =>
Fold m a b -> Fold m b c -> Fold m a c
scanMany = forall (m :: * -> *) a b c.
Monad m =>
Bool -> Fold m a b -> Fold m b c -> Fold m a c
scanWith Bool
True
{-# INLINE_NORMAL deleteBy #-}
deleteBy :: Monad m => (a -> a -> Bool) -> a -> Fold m a (Maybe a)
deleteBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Bool) -> a -> Fold m a (Maybe a)
deleteBy a -> a -> Bool
eq a
x0 = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {a} {b}. Tuple' a b -> b
extract forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' forall {b}. Tuple' Bool b -> a -> Tuple' Bool (Maybe a)
step (forall a b. a -> b -> Tuple' a b
Tuple' Bool
False forall a. Maybe a
Nothing)
where
step :: Tuple' Bool b -> a -> Tuple' Bool (Maybe a)
step (Tuple' Bool
False b
_) a
x =
if a -> a -> Bool
eq a
x a
x0
then forall a b. a -> b -> Tuple' a b
Tuple' Bool
True forall a. Maybe a
Nothing
else forall a b. a -> b -> Tuple' a b
Tuple' Bool
False (forall a. a -> Maybe a
Just a
x)
step (Tuple' Bool
True b
_) a
x = forall a b. a -> b -> Tuple' a b
Tuple' Bool
True (forall a. a -> Maybe a
Just a
x)
extract :: Tuple' a b -> b
extract (Tuple' a
_ b
x) = b
x
{-# INLINE slide2 #-}
slide2 :: Monad m => Fold m (a, Maybe a) b -> Fold m a b
slide2 :: forall (m :: * -> *) a b.
Monad m =>
Fold m (a, Maybe a) b -> Fold m a b
slide2 (Fold s -> (a, Maybe a) -> m (Step s b)
step1 m (Step s b)
initial1 s -> m b
extract1) = forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold Tuple' (Maybe a) s -> a -> m (Step (Tuple' (Maybe a) s) b)
step forall {a}. m (Step (Tuple' (Maybe a) s) b)
initial forall {a}. Tuple' a s -> m b
extract
where
initial :: m (Step (Tuple' (Maybe a) s) b)
initial =
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (forall a b. a -> b -> Tuple' a b
Tuple' forall a. Maybe a
Nothing) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Step s b)
initial1
step :: Tuple' (Maybe a) s -> a -> m (Step (Tuple' (Maybe a) s) b)
step (Tuple' Maybe a
prev s
s) a
cur =
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (forall a b. a -> b -> Tuple' a b
Tuple' (forall a. a -> Maybe a
Just a
cur)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> (a, Maybe a) -> m (Step s b)
step1 s
s (a
cur, Maybe a
prev)
extract :: Tuple' a s -> m b
extract (Tuple' a
_ s
s) = s -> m b
extract1 s
s
{-# INLINE uniqBy #-}
uniqBy :: Monad m => (a -> a -> Bool) -> Fold m a (Maybe a)
uniqBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Bool) -> Fold m a (Maybe a)
uniqBy a -> a -> Bool
eq = forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> b) -> Fold m a b
rollingMap Maybe a -> a -> Maybe a
f
where
f :: Maybe a -> a -> Maybe a
f Maybe a
pre a
curr =
case Maybe a
pre of
Maybe a
Nothing -> forall a. a -> Maybe a
Just a
curr
Just a
x -> if a
x a -> a -> Bool
`eq` a
curr then forall a. Maybe a
Nothing else forall a. a -> Maybe a
Just a
curr
{-# INLINE uniq #-}
uniq :: (Monad m, Eq a) => Fold m a (Maybe a)
uniq :: forall (m :: * -> *) a. (Monad m, Eq a) => Fold m a (Maybe a)
uniq = forall (m :: * -> *) a.
Monad m =>
(a -> a -> Bool) -> Fold m a (Maybe a)
uniqBy forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE prune #-}
prune ::
(a -> Bool) -> Fold m a (Maybe a)
prune :: forall a (m :: * -> *). (a -> Bool) -> Fold m a (Maybe a)
prune = forall a. HasCallStack => [Char] -> a
error [Char]
"Not implemented yet!"
repeated ::
Fold m a (Maybe a)
repeated :: forall (m :: * -> *) a. Fold m a (Maybe a)
repeated = forall a. HasCallStack => [Char] -> a
error [Char]
"Not implemented yet!"
{-# INLINE drainMapM #-}
drainMapM :: Monad m => (a -> m b) -> Fold m a ()
drainMapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> Fold m a ()
drainMapM a -> m b
f = forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Fold m b r -> Fold m a r
lmapM a -> m b
f forall (m :: * -> *) a. Monad m => Fold m a ()
drain
{-# DEPRECATED drainBy "Please use 'drainMapM' instead." #-}
{-# INLINE drainBy #-}
drainBy :: Monad m => (a -> m b) -> Fold m a ()
drainBy :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> Fold m a ()
drainBy = forall (m :: * -> *) a b. Monad m => (a -> m b) -> Fold m a ()
drainMapM
{-# INLINE latest #-}
latest :: Monad m => Fold m a (Maybe a)
latest :: forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
latest = forall (m :: * -> *) a.
Monad m =>
(a -> a -> a) -> Fold m a (Maybe a)
foldl1' (\a
_ a
x -> a
x)
{-# DEPRECATED last "Please use 'latest' instead." #-}
{-# INLINE last #-}
last :: Monad m => Fold m a (Maybe a)
last :: forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
last = forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
latest
{-# INLINE the #-}
the :: (Monad m, Eq a) => Fold m a (Maybe a)
the :: forall (m :: * -> *) a. (Monad m, Eq a) => Fold m a (Maybe a)
the = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' forall {a} {a}. Eq a => Maybe a -> a -> Step (Maybe a) (Maybe a)
step forall {a} {b}. Step (Maybe a) b
initial forall a. a -> a
id
where
initial :: Step (Maybe a) b
initial = forall s b. s -> Step s b
Partial forall a. Maybe a
Nothing
step :: Maybe a -> a -> Step (Maybe a) (Maybe a)
step Maybe a
Nothing a
x = forall s b. s -> Step s b
Partial (forall a. a -> Maybe a
Just a
x)
step old :: Maybe a
old@(Just a
x0) a
x =
if a
x0 forall a. Eq a => a -> a -> Bool
== a
x
then forall s b. s -> Step s b
Partial Maybe a
old
else forall s b. b -> Step s b
Done forall a. Maybe a
Nothing
{-# INLINE lengthGeneric #-}
lengthGeneric :: (Monad m, Num b) => Fold m a b
lengthGeneric :: forall (m :: * -> *) b a. (Monad m, Num b) => Fold m a b
lengthGeneric = forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' (\b
n a
_ -> b
n forall a. Num a => a -> a -> a
+ b
1) b
0
{-# INLINE length #-}
length :: Monad m => Fold m a Int
length :: forall (m :: * -> *) a. Monad m => Fold m a Int
length = forall (m :: * -> *) b a. (Monad m, Num b) => Fold m a b
lengthGeneric
{-# INLINE sum #-}
sum :: (Monad m, Num a) => Fold m a a
sum :: forall (m :: * -> *) a. (Monad m, Num a) => Fold m a a
sum = forall (m :: * -> *) a b. Fold m (a, Maybe a) b -> Fold m a b
FoldW.cumulative forall (m :: * -> *) a. (Monad m, Num a) => Fold m (a, Maybe a) a
FoldW.sum
{-# INLINE product #-}
product :: (Monad m, Num a, Eq a) => Fold m a a
product :: forall (m :: * -> *) a. (Monad m, Num a, Eq a) => Fold m a a
product = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' forall {s} {b}. (Eq s, Num s, Num b) => s -> s -> Step s b
step (forall s b. s -> Step s b
Partial a
1) forall a. a -> a
id
where
step :: s -> s -> Step s b
step s
x s
a =
if s
a forall a. Eq a => a -> a -> Bool
== s
0
then forall s b. b -> Step s b
Done b
0
else forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ s
x forall a. Num a => a -> a -> a
* s
a
{-# INLINE maximumBy #-}
maximumBy :: Monad m => (a -> a -> Ordering) -> Fold m a (Maybe a)
maximumBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Ordering) -> Fold m a (Maybe a)
maximumBy a -> a -> Ordering
cmp = forall (m :: * -> *) a.
Monad m =>
(a -> a -> a) -> Fold m a (Maybe a)
foldl1' a -> a -> a
max'
where
max' :: a -> a -> a
max' a
x a
y =
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a
x
Ordering
_ -> a
y
{-# INLINE maximum #-}
maximum :: (Monad m, Ord a) => Fold m a (Maybe a)
maximum :: forall (m :: * -> *) a. (Monad m, Ord a) => Fold m a (Maybe a)
maximum = forall (m :: * -> *) a.
Monad m =>
(a -> a -> a) -> Fold m a (Maybe a)
foldl1' forall a. Ord a => a -> a -> a
max
{-# INLINE minimumBy #-}
minimumBy :: Monad m => (a -> a -> Ordering) -> Fold m a (Maybe a)
minimumBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Ordering) -> Fold m a (Maybe a)
minimumBy a -> a -> Ordering
cmp = forall (m :: * -> *) a.
Monad m =>
(a -> a -> a) -> Fold m a (Maybe a)
foldl1' a -> a -> a
min'
where
min' :: a -> a -> a
min' a
x a
y =
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a
y
Ordering
_ -> a
x
{-# INLINE minimum #-}
minimum :: (Monad m, Ord a) => Fold m a (Maybe a)
minimum :: forall (m :: * -> *) a. (Monad m, Ord a) => Fold m a (Maybe a)
minimum = forall (m :: * -> *) a.
Monad m =>
(a -> a -> a) -> Fold m a (Maybe a)
foldl1' forall a. Ord a => a -> a -> a
min
{-# INLINE mean #-}
mean :: (Monad m, Fractional a) => Fold m a a
mean :: forall (m :: * -> *) a. (Monad m, Fractional a) => Fold m a a
mean = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {a} {b}. Tuple' a b -> a
done forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' forall {b}. Fractional b => Tuple' b b -> b -> Tuple' b b
step Tuple' a a
begin
where
begin :: Tuple' a a
begin = forall a b. a -> b -> Tuple' a b
Tuple' a
0 a
0
step :: Tuple' b b -> b -> Tuple' b b
step (Tuple' b
x b
n) b
y =
let n1 :: b
n1 = b
n forall a. Num a => a -> a -> a
+ b
1
in forall a b. a -> b -> Tuple' a b
Tuple' (b
x forall a. Num a => a -> a -> a
+ (b
y forall a. Num a => a -> a -> a
- b
x) forall a. Fractional a => a -> a -> a
/ b
n1) b
n1
done :: Tuple' a b -> a
done (Tuple' a
x b
_) = a
x
{-# DEPRECATED variance "Use the streamly-statistics package instead" #-}
{-# INLINE variance #-}
variance :: (Monad m, Fractional a) => Fold m a a
variance :: forall (m :: * -> *) a. (Monad m, Fractional a) => Fold m a a
variance = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {a} {b}. Fractional a => Tuple3' a b a -> a
done forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' forall {c}. Fractional c => Tuple3' c c c -> c -> Tuple3' c c c
step Tuple3' a a a
begin
where
begin :: Tuple3' a a a
begin = forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' a
0 a
0 a
0
step :: Tuple3' c c c -> c -> Tuple3' c c c
step (Tuple3' c
n c
mean_ c
m2) c
x = forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' c
n' c
mean' c
m2'
where
n' :: c
n' = c
n forall a. Num a => a -> a -> a
+ c
1
mean' :: c
mean' = (c
n forall a. Num a => a -> a -> a
* c
mean_ forall a. Num a => a -> a -> a
+ c
x) forall a. Fractional a => a -> a -> a
/ (c
n forall a. Num a => a -> a -> a
+ c
1)
delta :: c
delta = c
x forall a. Num a => a -> a -> a
- c
mean_
m2' :: c
m2' = c
m2 forall a. Num a => a -> a -> a
+ c
delta forall a. Num a => a -> a -> a
* c
delta forall a. Num a => a -> a -> a
* c
n forall a. Fractional a => a -> a -> a
/ (c
n forall a. Num a => a -> a -> a
+ c
1)
done :: Tuple3' a b a -> a
done (Tuple3' a
n b
_ a
m2) = a
m2 forall a. Fractional a => a -> a -> a
/ a
n
{-# DEPRECATED stdDev "Use the streamly-statistics package instead" #-}
{-# INLINE stdDev #-}
stdDev :: (Monad m, Floating a) => Fold m a a
stdDev :: forall (m :: * -> *) a. (Monad m, Floating a) => Fold m a a
stdDev = forall a. Floating a => a -> a
sqrt forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a. (Monad m, Fractional a) => Fold m a a
variance
{-# INLINE rollingHashWithSalt #-}
rollingHashWithSalt :: (Monad m, Enum a) => Int64 -> Fold m a Int64
rollingHashWithSalt :: forall (m :: * -> *) a.
(Monad m, Enum a) =>
Int64 -> Fold m a Int64
rollingHashWithSalt = forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' forall {a}. Enum a => Int64 -> a -> Int64
step
where
k :: Int64
k = Int64
2891336453 :: Int64
step :: Int64 -> a -> Int64
step Int64
cksum a
a = Int64
cksum forall a. Num a => a -> a -> a
* Int64
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)
{-# INLINE defaultSalt #-}
defaultSalt :: Int64
defaultSalt :: Int64
defaultSalt = -Int64
2578643520546668380
{-# INLINE rollingHash #-}
rollingHash :: (Monad m, Enum a) => Fold m a Int64
rollingHash :: forall (m :: * -> *) a. (Monad m, Enum a) => Fold m a Int64
rollingHash = forall (m :: * -> *) a.
(Monad m, Enum a) =>
Int64 -> Fold m a Int64
rollingHashWithSalt Int64
defaultSalt
{-# INLINE rollingHashFirstN #-}
rollingHashFirstN :: (Monad m, Enum a) => Int -> Fold m a Int64
rollingHashFirstN :: forall (m :: * -> *) a. (Monad m, Enum a) => Int -> Fold m a Int64
rollingHashFirstN Int
n = forall (m :: * -> *) a b.
Monad m =>
Int -> Fold m a b -> Fold m a b
take Int
n forall (m :: * -> *) a. (Monad m, Enum a) => Fold m a Int64
rollingHash
{-# INLINE rollingMapM #-}
rollingMapM :: Monad m => (Maybe a -> a -> m b) -> Fold m a b
rollingMapM :: forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> m b) -> Fold m a b
rollingMapM Maybe a -> a -> m b
f = forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold forall {b} {b}. (Maybe a, b) -> a -> m (Step (Maybe a, b) b)
step forall {a} {b} {b}. m (Step (Maybe a, b) b)
initial forall {a} {b}. (a, b) -> m b
extract
where
initial :: m (Step (Maybe a, b) b)
initial = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial (forall a. Maybe a
Nothing, forall a. HasCallStack => [Char] -> a
error [Char]
"Empty stream")
step :: (Maybe a, b) -> a -> m (Step (Maybe a, b) b)
step (Maybe a
prev, b
_) a
cur = do
b
x <- Maybe a -> a -> m b
f Maybe a
prev a
cur
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial (forall a. a -> Maybe a
Just a
cur, b
x)
extract :: (a, b) -> m b
extract = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd
{-# INLINE rollingMap #-}
rollingMap :: Monad m => (Maybe a -> a -> b) -> Fold m a b
rollingMap :: forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> b) -> Fold m a b
rollingMap Maybe a -> a -> b
f = forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> m b) -> Fold m a b
rollingMapM (\Maybe a
x a
y -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Maybe a -> a -> b
f Maybe a
x a
y)
{-# INLINE sconcat #-}
sconcat :: (Monad m, Semigroup a) => a -> Fold m a a
sconcat :: forall (m :: * -> *) a. (Monad m, Semigroup a) => a -> Fold m a a
sconcat = forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' forall a. Semigroup a => a -> a -> a
(<>)
{-# INLINE mconcat #-}
mconcat ::
( Monad m
, Monoid a) => Fold m a a
mconcat :: forall (m :: * -> *) a. (Monad m, Monoid a) => Fold m a a
mconcat = forall (m :: * -> *) a. (Monad m, Semigroup a) => a -> Fold m a a
sconcat forall a. Monoid a => a
mempty
{-# INLINE foldMap #-}
foldMap :: (Monad m, Monoid b) => (a -> b) -> Fold m a b
foldMap :: forall (m :: * -> *) b a.
(Monad m, Monoid b) =>
(a -> b) -> Fold m a b
foldMap a -> b
f = forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap a -> b
f forall (m :: * -> *) a. (Monad m, Monoid a) => Fold m a a
mconcat
{-# INLINE foldMapM #-}
foldMapM :: (Monad m, Monoid b) => (a -> m b) -> Fold m a b
foldMapM :: forall (m :: * -> *) b a.
(Monad m, Monoid b) =>
(a -> m b) -> Fold m a b
foldMapM a -> m b
act = forall (m :: * -> *) b a.
Monad m =>
(b -> a -> m b) -> m b -> Fold m a b
foldlM' b -> a -> m b
step (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Monoid a => a
mempty)
where
step :: b -> a -> m b
step b
m a
a = do
b
m' <- a -> m b
act a
a
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! forall a. Monoid a => a -> a -> a
mappend b
m b
m'
{-# INLINE toListRev #-}
toListRev :: Monad m => Fold m a [a]
toListRev :: forall (m :: * -> *) a. Monad m => Fold m a [a]
toListRev = forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' (forall a b c. (a -> b -> c) -> b -> a -> c
flip (:)) []
{-# INLINE drainN #-}
drainN :: Monad m => Int -> Fold m a ()
drainN :: forall (m :: * -> *) a. Monad m => Int -> Fold m a ()
drainN Int
n = forall (m :: * -> *) a b.
Monad m =>
Int -> Fold m a b -> Fold m a b
take Int
n forall (m :: * -> *) a. Monad m => Fold m a ()
drain
{-# INLINE indexGeneric #-}
indexGeneric :: (Integral i, Monad m) => i -> Fold m a (Maybe a)
indexGeneric :: forall i (m :: * -> *) a.
(Integral i, Monad m) =>
i -> Fold m a (Maybe a)
indexGeneric i
i = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' forall {a}. i -> a -> Step i (Maybe a)
step (forall s b. s -> Step s b
Partial i
0) (forall a b. a -> b -> a
const forall a. Maybe a
Nothing)
where
step :: i -> a -> Step i (Maybe a)
step i
j a
a =
if i
i forall a. Eq a => a -> a -> Bool
== i
j
then forall s b. b -> Step s b
Done forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
a
else forall s b. s -> Step s b
Partial (i
j forall a. Num a => a -> a -> a
+ i
1)
{-# INLINE index #-}
index :: Monad m => Int -> Fold m a (Maybe a)
index :: forall (m :: * -> *) a. Monad m => Int -> Fold m a (Maybe a)
index = forall i (m :: * -> *) a.
(Integral i, Monad m) =>
i -> Fold m a (Maybe a)
indexGeneric
{-# INLINE maybe #-}
maybe :: Monad m => (a -> Maybe b) -> Fold m a (Maybe b)
maybe :: forall (m :: * -> *) a b.
Monad m =>
(a -> Maybe b) -> Fold m a (Maybe b)
maybe a -> Maybe b
f = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' (forall a b. a -> b -> a
const (forall s b. b -> Step s b
Done forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Maybe b
f)) (forall s b. s -> Step s b
Partial forall a. Maybe a
Nothing) forall a. a -> a
id
{-# INLINE satisfy #-}
satisfy :: Monad m => (a -> Bool) -> Fold m a (Maybe a)
satisfy :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe a)
satisfy a -> Bool
f = forall (m :: * -> *) a b.
Monad m =>
(a -> Maybe b) -> Fold m a (Maybe b)
maybe (\a
a -> if a -> Bool
f a
a then forall a. a -> Maybe a
Just a
a else forall a. Maybe a
Nothing)
{-# INLINE one #-}
one :: Monad m => Fold m a (Maybe a)
one :: forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
one = forall (m :: * -> *) a b.
Monad m =>
(a -> Maybe b) -> Fold m a (Maybe b)
maybe forall a. a -> Maybe a
Just
{-# DEPRECATED head "Please use \"one\" instead" #-}
{-# INLINE head #-}
head :: Monad m => Fold m a (Maybe a)
head :: forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
head = forall (m :: * -> *) a. Monad m => Fold m a (Maybe a)
one
{-# INLINE findM #-}
findM :: Monad m => (a -> m Bool) -> Fold m a (Maybe a)
findM :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Fold m a (Maybe a)
findM a -> m Bool
predicate = forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold () -> a -> m (Step () (Maybe a))
step (forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial ()) (forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing)
where
step :: () -> a -> m (Step () (Maybe a))
step () a
a =
let f :: Bool -> Step () (Maybe a)
f Bool
r =
if Bool
r
then forall s b. b -> Step s b
Done (forall a. a -> Maybe a
Just a
a)
else forall s b. s -> Step s b
Partial ()
in Bool -> Step () (Maybe a)
f forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m Bool
predicate a
a
{-# INLINE find #-}
find :: Monad m => (a -> Bool) -> Fold m a (Maybe a)
find :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe a)
find a -> Bool
p = forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Fold m a (Maybe a)
findM (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# INLINE lookup #-}
lookup :: (Eq a, Monad m) => a -> Fold m (a,b) (Maybe b)
lookup :: forall a (m :: * -> *) b.
(Eq a, Monad m) =>
a -> Fold m (a, b) (Maybe b)
lookup a
a0 = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' forall {a}. () -> (a, a) -> Step () (Maybe a)
step (forall s b. s -> Step s b
Partial ()) (forall a b. a -> b -> a
const forall a. Maybe a
Nothing)
where
step :: () -> (a, a) -> Step () (Maybe a)
step () (a
a, a
b) =
if a
a forall a. Eq a => a -> a -> Bool
== a
a0
then forall s b. b -> Step s b
Done forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
b
else forall s b. s -> Step s b
Partial ()
{-# INLINE findIndex #-}
findIndex :: Monad m => (a -> Bool) -> Fold m a (Maybe Int)
findIndex :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe Int)
findIndex a -> Bool
predicate = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' forall {s}. Num s => s -> a -> Step s (Maybe s)
step (forall s b. s -> Step s b
Partial Int
0) (forall a b. a -> b -> a
const forall a. Maybe a
Nothing)
where
step :: s -> a -> Step s (Maybe s)
step s
i a
a =
if a -> Bool
predicate a
a
then forall s b. b -> Step s b
Done forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just s
i
else forall s b. s -> Step s b
Partial (s
i forall a. Num a => a -> a -> a
+ s
1)
{-# INLINE findIndices #-}
findIndices :: Monad m => (a -> Bool) -> Fold m a (Maybe Int)
findIndices :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe Int)
findIndices a -> Bool
predicate =
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a b. a -> b -> a
const forall a. Maybe a
Nothing) forall a. a -> Maybe a
Just) forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' forall {a}. Num a => Either a a -> a -> Either a a
step (forall a b. a -> Either a b
Left (-Int
1))
where
step :: Either a a -> a -> Either a a
step Either a a
i a
a =
if a -> Bool
predicate a
a
then forall a b. b -> Either a b
Right (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. a -> a
id forall a. a -> a
id Either a a
i forall a. Num a => a -> a -> a
+ a
1)
else forall a b. a -> Either a b
Left (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. a -> a
id forall a. a -> a
id Either a a
i forall a. Num a => a -> a -> a
+ a
1)
{-# INLINE elemIndices #-}
elemIndices :: (Monad m, Eq a) => a -> Fold m a (Maybe Int)
elemIndices :: forall (m :: * -> *) a.
(Monad m, Eq a) =>
a -> Fold m a (Maybe Int)
elemIndices a
a = forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe Int)
findIndices (forall a. Eq a => a -> a -> Bool
== a
a)
{-# INLINE elemIndex #-}
elemIndex :: (Eq a, Monad m) => a -> Fold m a (Maybe Int)
elemIndex :: forall a (m :: * -> *).
(Eq a, Monad m) =>
a -> Fold m a (Maybe Int)
elemIndex a
a = forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe Int)
findIndex (forall a. Eq a => a -> a -> Bool
== a
a)
{-# INLINE null #-}
null :: Monad m => Fold m a Bool
null :: forall (m :: * -> *) a. Monad m => Fold m a Bool
null = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' (\() a
_ -> forall s b. b -> Step s b
Done Bool
False) (forall s b. s -> Step s b
Partial ()) (forall a b. a -> b -> a
const Bool
True)
{-# INLINE any #-}
any :: Monad m => (a -> Bool) -> Fold m a Bool
any :: forall (m :: * -> *) a. Monad m => (a -> Bool) -> Fold m a Bool
any a -> Bool
predicate = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' forall {p}. p -> a -> Step Bool Bool
step forall {b}. Step Bool b
initial forall a. a -> a
id
where
initial :: Step Bool b
initial = forall s b. s -> Step s b
Partial Bool
False
step :: p -> a -> Step Bool Bool
step p
_ a
a =
if a -> Bool
predicate a
a
then forall s b. b -> Step s b
Done Bool
True
else forall s b. s -> Step s b
Partial Bool
False
{-# INLINE elem #-}
elem :: (Eq a, Monad m) => a -> Fold m a Bool
elem :: forall a (m :: * -> *). (Eq a, Monad m) => a -> Fold m a Bool
elem a
a = forall (m :: * -> *) a. Monad m => (a -> Bool) -> Fold m a Bool
any (forall a. Eq a => a -> a -> Bool
== a
a)
{-# INLINE all #-}
all :: Monad m => (a -> Bool) -> Fold m a Bool
all :: forall (m :: * -> *) a. Monad m => (a -> Bool) -> Fold m a Bool
all a -> Bool
predicate = forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Fold m a b
foldt' forall {p}. p -> a -> Step Bool Bool
step forall {b}. Step Bool b
initial forall a. a -> a
id
where
initial :: Step Bool b
initial = forall s b. s -> Step s b
Partial Bool
True
step :: p -> a -> Step Bool Bool
step p
_ a
a =
if a -> Bool
predicate a
a
then forall s b. s -> Step s b
Partial Bool
True
else forall s b. b -> Step s b
Done Bool
False
{-# INLINE notElem #-}
notElem :: (Eq a, Monad m) => a -> Fold m a Bool
notElem :: forall a (m :: * -> *). (Eq a, Monad m) => a -> Fold m a Bool
notElem a
a = forall (m :: * -> *) a. Monad m => (a -> Bool) -> Fold m a Bool
all (forall a. Eq a => a -> a -> Bool
/= a
a)
{-# INLINE and #-}
and :: Monad m => Fold m Bool Bool
and :: forall (m :: * -> *). Monad m => Fold m Bool Bool
and = forall (m :: * -> *) a. Monad m => (a -> Bool) -> Fold m a Bool
all (forall a. Eq a => a -> a -> Bool
== Bool
True)
{-# INLINE or #-}
or :: Monad m => Fold m Bool Bool
or :: forall (m :: * -> *). Monad m => Fold m Bool Bool
or = forall (m :: * -> *) a. Monad m => (a -> Bool) -> Fold m a Bool
any (forall a. Eq a => a -> a -> Bool
== Bool
True)
{-# INLINE splitAt #-}
splitAt
:: Monad m
=> Int
-> Fold m a b
-> Fold m a c
-> Fold m a (b, c)
splitAt :: forall (m :: * -> *) a b c.
Monad m =>
Int -> Fold m a b -> Fold m a c -> Fold m a (b, c)
splitAt Int
n Fold m a b
fld = forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
splitWith (,) (forall (m :: * -> *) a b.
Monad m =>
Int -> Fold m a b -> Fold m a b
take Int
n Fold m a b
fld)
{-# INLINE takingEndByM #-}
takingEndByM :: Monad m => (a -> m Bool) -> Fold m a (Maybe a)
takingEndByM :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Fold m a (Maybe a)
takingEndByM a -> m Bool
p = forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold forall {p}. p -> a -> m (Step (Maybe' a) (Maybe a))
step forall {a} {b}. m (Step (Maybe' a) b)
initial (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Maybe' a -> Maybe a
toMaybe)
where
initial :: m (Step (Maybe' a) b)
initial = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a. Maybe' a
Nothing'
step :: p -> a -> m (Step (Maybe' a) (Maybe a))
step p
_ a
a = do
Bool
r <- a -> m Bool
p a
a
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ if Bool
r
then forall s b. b -> Step s b
Done forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
a
else forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe' a
Just' a
a
{-# INLINE takingEndBy #-}
takingEndBy :: Monad m => (a -> Bool) -> Fold m a (Maybe a)
takingEndBy :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe a)
takingEndBy a -> Bool
p = forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Fold m a (Maybe a)
takingEndByM (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# INLINE takingEndByM_ #-}
takingEndByM_ :: Monad m => (a -> m Bool) -> Fold m a (Maybe a)
takingEndByM_ :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Fold m a (Maybe a)
takingEndByM_ a -> m Bool
p = forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold forall {p} {a}. p -> a -> m (Step (Maybe' a) (Maybe a))
step forall {a} {b}. m (Step (Maybe' a) b)
initial (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Maybe' a -> Maybe a
toMaybe)
where
initial :: m (Step (Maybe' a) b)
initial = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a. Maybe' a
Nothing'
step :: p -> a -> m (Step (Maybe' a) (Maybe a))
step p
_ a
a = do
Bool
r <- a -> m Bool
p a
a
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ if Bool
r
then forall s b. b -> Step s b
Done forall a. Maybe a
Nothing
else forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe' a
Just' a
a
{-# INLINE takingEndBy_ #-}
takingEndBy_ :: Monad m => (a -> Bool) -> Fold m a (Maybe a)
takingEndBy_ :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe a)
takingEndBy_ a -> Bool
p = forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Fold m a (Maybe a)
takingEndByM_ (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# INLINE droppingWhileM #-}
droppingWhileM :: Monad m => (a -> m Bool) -> Fold m a (Maybe a)
droppingWhileM :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Fold m a (Maybe a)
droppingWhileM a -> m Bool
p = forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold forall {a} {b}. Maybe' a -> a -> m (Step (Maybe' a) b)
step forall {a} {b}. m (Step (Maybe' a) b)
initial (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Maybe' a -> Maybe a
toMaybe)
where
initial :: m (Step (Maybe' a) b)
initial = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a. Maybe' a
Nothing'
step :: Maybe' a -> a -> m (Step (Maybe' a) b)
step Maybe' a
Nothing' a
a = do
Bool
r <- a -> m Bool
p a
a
forall (m :: * -> *) a. Monad m => a -> m a
return
forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial
forall a b. (a -> b) -> a -> b
$ if Bool
r
then forall a. Maybe' a
Nothing'
else forall a. a -> Maybe' a
Just' a
a
step Maybe' a
_ a
a = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe' a
Just' a
a
{-# INLINE droppingWhile #-}
droppingWhile :: Monad m => (a -> Bool) -> Fold m a (Maybe a)
droppingWhile :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Fold m a (Maybe a)
droppingWhile a -> Bool
p = forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Fold m a (Maybe a)
droppingWhileM (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# INLINE takeEndBy_ #-}
takeEndBy_ :: Monad m => (a -> Bool) -> Fold m a b -> Fold m a b
takeEndBy_ :: forall (m :: * -> *) a b.
Monad m =>
(a -> Bool) -> Fold m a b -> Fold m a b
takeEndBy_ a -> Bool
predicate (Fold s -> a -> m (Step s b)
fstep m (Step s b)
finitial s -> m b
fextract) =
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold s -> a -> m (Step s b)
step m (Step s b)
finitial s -> m b
fextract
where
step :: s -> a -> m (Step s b)
step s
s a
a =
if Bool -> Bool
not (a -> Bool
predicate a
a)
then s -> a -> m (Step s b)
fstep s
s a
a
else forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s
{-# INLINE takeEndBy #-}
takeEndBy :: Monad m => (a -> Bool) -> Fold m a b -> Fold m a b
takeEndBy :: forall (m :: * -> *) a b.
Monad m =>
(a -> Bool) -> Fold m a b -> Fold m a b
takeEndBy a -> Bool
predicate (Fold s -> a -> m (Step s b)
fstep m (Step s b)
finitial s -> m b
fextract) =
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold s -> a -> m (Step s b)
step m (Step s b)
finitial s -> m b
fextract
where
step :: s -> a -> m (Step s b)
step s
s a
a = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
a
if Bool -> Bool
not (a -> Bool
predicate a
a)
then forall (m :: * -> *) a. Monad m => a -> m a
return Step s b
res
else do
case Step s b
res of
Partial s
s1 -> forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
data SplitOnSeqState acc a rb rh w ck =
SplitOnSeqEmpty !acc
| SplitOnSeqSingle !acc !a
| SplitOnSeqWord !acc !Int !w
| SplitOnSeqWordLoop !acc !w
| SplitOnSeqKR !acc !Int !rb !rh
| SplitOnSeqKRLoop !acc !ck !rb !rh
{-# INLINE takeEndBySeq #-}
takeEndBySeq :: forall m a b. (MonadIO m, Storable a, Unbox a, Enum a, Eq a) =>
Array.Array a
-> Fold m a b
-> Fold m a b
takeEndBySeq :: forall (m :: * -> *) a b.
(MonadIO m, Storable a, Unbox a, Enum a, Eq a) =>
Array a -> Fold m a b -> Fold m a b
takeEndBySeq Array a
patArr (Fold s -> a -> m (Step s b)
fstep m (Step s b)
finitial s -> m b
fextract) =
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold SplitOnSeqState s a (Ring a) (Ptr a) Word Word32
-> a
-> m (Step (SplitOnSeqState s a (Ring a) (Ptr a) Word Word32) b)
step forall {ck}.
m (Step (SplitOnSeqState s a (Ring a) (Ptr a) Word ck) b)
initial forall {a} {rb} {rh} {w} {ck}.
SplitOnSeqState s a rb rh w ck -> m b
extract
where
patLen :: Int
patLen = forall a. Unbox a => Array a -> Int
Array.length Array a
patArr
initial :: m (Step (SplitOnSeqState s a (Ring a) (Ptr a) Word ck) b)
initial = do
Step s b
res <- m (Step s b)
finitial
case Step s b
res of
Partial s
acc
| Int
patLen forall a. Eq a => a -> a -> Bool
== Int
0 ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck. acc -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqEmpty s
acc
| Int
patLen forall a. Eq a => a -> a -> Bool
== Int
1 -> do
a
pat <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Unbox a => Int -> Array a -> IO a
Array.unsafeIndexIO Int
0 Array a
patArr
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> a -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqSingle s
acc a
pat
| SIZE_OF(a) * patLen <= sizeOf (Proxy :: Proxy Word) ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> Int -> w -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqWord s
acc Int
0 Word
0
| Bool
otherwise -> 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)
Ring.new Int
patLen
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> Int -> rb -> rh -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqKR s
acc Int
0 Ring a
rb Ptr a
rhead
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
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
wordPat :: Word
wordPat :: Word
wordPat = Word
wordMask forall a. Bits a => a -> a -> a
.&. forall a b. Unbox a => (b -> a -> b) -> b -> Array a -> b
Array.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. Unbox a => (b -> a -> b) -> b -> Array a -> b
Array.foldl' forall {a}. Enum a => Word32 -> a -> Word32
addCksum Word32
0 Array a
patArr
step :: SplitOnSeqState s a (Ring a) (Ptr a) Word Word32
-> a
-> m (Step (SplitOnSeqState s a (Ring a) (Ptr a) Word Word32) b)
step (SplitOnSeqEmpty s
s) a
x = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
x
case Step s b
res of
Partial s
s1 -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck. acc -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqEmpty s
s1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
step (SplitOnSeqSingle s
s a
pat) a
x = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
x
case Step s b
res of
Partial s
s1
| a
pat forall a. Eq a => a -> a -> Bool
/= a
x -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> a -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqSingle s
s1 a
pat
| Bool
otherwise -> forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
step (SplitOnSeqWord s
s Int
idx Word
wrd) a
x = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
x
let wrd1 :: Word
wrd1 = forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
wrd a
x
case Step s b
res of
Partial s
s1
| Int
idx forall a. Eq a => a -> a -> Bool
== Int
maxIndex -> do
if Word
wrd1 forall a. Bits a => a -> a -> a
.&. Word
wordMask forall a. Eq a => a -> a -> Bool
== Word
wordPat
then forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s1
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> w -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqWordLoop s
s1 Word
wrd1
| Bool
otherwise ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> Int -> w -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqWord s
s1 (Int
idx forall a. Num a => a -> a -> a
+ Int
1) Word
wrd1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
step (SplitOnSeqWordLoop s
s Word
wrd) a
x = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
x
let wrd1 :: Word
wrd1 = forall {a} {a}. (Bits a, Num a, Enum a) => a -> a -> a
addToWord Word
wrd a
x
case Step s b
res of
Partial s
s1
| Word
wrd1 forall a. Bits a => a -> a -> a
.&. Word
wordMask forall a. Eq a => a -> a -> Bool
== Word
wordPat ->
forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s1
| Bool
otherwise ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> w -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqWordLoop s
s1 Word
wrd1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
step (SplitOnSeqKR s
s Int
idx Ring a
rb Ptr a
rh) a
x = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
x
case Step s b
res of
Partial s
s1 -> 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)
Ring.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
Ring.unsafeFoldRing (forall a. Ring a -> Ptr a
Ring.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 Bool -> Bool -> Bool
&& forall a. Ring a -> Ptr a -> Array a -> Bool
Ring.unsafeEqArray Ring a
rb Ptr a
rh1 Array a
patArr
then forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s1
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> ck -> rb -> rh -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqKRLoop s
s1 Word32
ringHash Ring a
rb Ptr a
rh1
else
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> Int -> rb -> rh -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqKR s
s1 (Int
idx forall a. Num a => a -> a -> a
+ Int
1) Ring a
rb Ptr a
rh1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
step (SplitOnSeqKRLoop s
s Word32
cksum Ring a
rb Ptr a
rh) a
x = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
x
case Step s b
res of
Partial s
s1 -> 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 b. (a -> b) -> a -> b
$ forall a. Storable a => Ring a -> Ptr a -> a -> IO (Ptr a)
Ring.unsafeInsert Ring a
rb Ptr a
rh a
x
let ringHash :: Word32
ringHash = forall {a} {a}. (Enum a, Enum a) => Word32 -> a -> a -> Word32
deltaCksum Word32
cksum a
old a
x
if Word32
ringHash forall a. Eq a => a -> a -> Bool
== Word32
patHash Bool -> Bool -> Bool
&& forall a. Ring a -> Ptr a -> Array a -> Bool
Ring.unsafeEqArray Ring a
rb Ptr a
rh1 Array a
patArr
then forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s1
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> ck -> rb -> rh -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqKRLoop s
s1 Word32
ringHash Ring a
rb Ptr a
rh1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
extract :: SplitOnSeqState s a rb rh w ck -> m b
extract SplitOnSeqState s a rb rh w ck
state =
let st :: s
st =
case SplitOnSeqState s a rb rh w ck
state of
SplitOnSeqEmpty s
s -> s
s
SplitOnSeqSingle s
s a
_ -> s
s
SplitOnSeqWord s
s Int
_ w
_ -> s
s
SplitOnSeqWordLoop s
s w
_ -> s
s
SplitOnSeqKR s
s Int
_ rb
_ rh
_ -> s
s
SplitOnSeqKRLoop s
s ck
_ rb
_ rh
_ -> s
s
in s -> m b
fextract s
st
{-# INLINE takeEndBySeq_ #-}
takeEndBySeq_ :: forall m a b. (MonadIO m, Storable a, Unbox a, Enum a, Eq a) =>
Array.Array a
-> Fold m a b
-> Fold m a b
takeEndBySeq_ :: forall (m :: * -> *) a b.
(MonadIO m, Storable a, Unbox a, Enum a, Eq a) =>
Array a -> Fold m a b -> Fold m a b
takeEndBySeq_ Array a
patArr (Fold s -> a -> m (Step s b)
fstep m (Step s b)
finitial s -> m b
fextract) =
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold SplitOnSeqState s a (Ring a) (Ptr a) Word Word32
-> a
-> m (Step (SplitOnSeqState s a (Ring a) (Ptr a) Word Word32) b)
step forall {ck}.
m (Step (SplitOnSeqState s a (Ring a) (Ptr a) Word ck) b)
initial forall {a} {ck}.
SplitOnSeqState s a (Ring a) (Ptr a) Word ck -> m b
extract
where
patLen :: Int
patLen = forall a. Unbox a => Array a -> Int
Array.length Array a
patArr
initial :: m (Step (SplitOnSeqState s a (Ring a) (Ptr a) Word ck) b)
initial = do
Step s b
res <- m (Step s b)
finitial
case Step s b
res of
Partial s
acc
| Int
patLen forall a. Eq a => a -> a -> Bool
== Int
0 ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck. acc -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqEmpty s
acc
| Int
patLen forall a. Eq a => a -> a -> Bool
== Int
1 -> do
a
pat <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Unbox a => Int -> Array a -> IO a
Array.unsafeIndexIO Int
0 Array a
patArr
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> a -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqSingle s
acc a
pat
| SIZE_OF(a) * patLen <= sizeOf (Proxy :: Proxy Word) ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> Int -> w -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqWord s
acc Int
0 Word
0
| Bool
otherwise -> 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)
Ring.new Int
patLen
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> Int -> rb -> rh -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqKR s
acc Int
0 Ring a
rb Ptr a
rhead
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
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. Unbox a => (b -> a -> b) -> b -> Array a -> b
Array.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. Unbox a => (b -> a -> b) -> b -> Array a -> b
Array.foldl' forall {a}. Enum a => Word32 -> a -> Word32
addCksum Word32
0 Array a
patArr
step :: SplitOnSeqState s a (Ring a) (Ptr a) Word Word32
-> a
-> m (Step (SplitOnSeqState s a (Ring a) (Ptr a) Word Word32) b)
step (SplitOnSeqEmpty s
s) a
x = do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
x
case Step s b
res of
Partial s
s1 -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck. acc -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqEmpty s
s1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
step (SplitOnSeqSingle s
s a
pat) a
x = do
if a
pat forall a. Eq a => a -> a -> Bool
/= a
x
then do
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
x
case Step s b
res of
Partial s
s1 -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> a -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqSingle s
s1 a
pat
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
else forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s
step (SplitOnSeqWord s
s Int
idx Word
wrd) a
x = 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 forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> w -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqWordLoop s
s Word
wrd1
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> Int -> w -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqWord s
s (Int
idx forall a. Num a => a -> a -> a
+ Int
1) Word
wrd1
step (SplitOnSeqWordLoop s
s Word
wrd) a
x = do
let 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
res <- s -> a -> m (Step s b)
fstep s
s (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
res of
Partial s
s1
| Word
wrd1 forall a. Bits a => a -> a -> a
.&. Word
wordMask forall a. Eq a => a -> a -> Bool
== Word
wordPat ->
forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s1
| Bool
otherwise ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> w -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqWordLoop s
s1 Word
wrd1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
step (SplitOnSeqKR s
s Int
idx Ring a
rb Ptr a
rh) a
x = 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)
Ring.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
Ring.unsafeFoldRing (forall a. Ring a -> Ptr a
Ring.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 Bool -> Bool -> Bool
&& forall a. Ring a -> Ptr a -> Array a -> Bool
Ring.unsafeEqArray Ring a
rb Ptr a
rh1 Array a
patArr
then forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> ck -> rb -> rh -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqKRLoop s
s Word32
ringHash Ring a
rb Ptr a
rh1
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> Int -> rb -> rh -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqKR s
s (Int
idx forall a. Num a => a -> a -> a
+ Int
1) Ring a
rb Ptr a
rh1
step (SplitOnSeqKRLoop s
s Word32
cksum Ring a
rb Ptr a
rh) a
x = 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
Step s b
res <- s -> a -> m (Step s b)
fstep s
s a
old
case Step s b
res of
Partial s
s1 -> 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)
Ring.unsafeInsert Ring a
rb Ptr a
rh a
x
let ringHash :: Word32
ringHash = forall {a} {a}. (Enum a, Enum a) => Word32 -> a -> a -> Word32
deltaCksum Word32
cksum a
old a
x
if Word32
ringHash forall a. Eq a => a -> a -> Bool
== Word32
patHash Bool -> Bool -> Bool
&& forall a. Ring a -> Ptr a -> Array a -> Bool
Ring.unsafeEqArray Ring a
rb Ptr a
rh1 Array a
patArr
then forall s b. b -> Step s b
Done forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m b
fextract s
s1
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ forall acc a rb rh w ck.
acc -> ck -> rb -> rh -> SplitOnSeqState acc a rb rh w ck
SplitOnSeqKRLoop s
s1 Word32
ringHash Ring a
rb Ptr a
rh1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done b
b
extract :: SplitOnSeqState s a (Ring a) (Ptr a) Word ck -> m b
extract SplitOnSeqState s a (Ring a) (Ptr a) Word ck
state = do
let consumeWord :: s -> Int -> Word -> m b
consumeWord s
s Int
n Word
wrd = do
if Int
n forall a. Eq a => a -> a -> Bool
== Int
0
then s -> m b
fextract s
s
else 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
s (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
Partial s
s1 -> s -> Int -> Word -> m b
consumeWord s
s1 (Int
n forall a. Num a => a -> a -> a
- Int
1) Word
wrd
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return b
b
let consumeRing :: s -> t -> Ring a -> Ptr a -> m b
consumeRing s
s t
n Ring a
rb Ptr a
rh =
if t
n forall a. Eq a => a -> a -> Bool
== t
0
then s -> m b
fextract s
s
else 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
Ring.advance Ring a
rb Ptr a
rh
Step s b
r <- s -> a -> m (Step s b)
fstep s
s a
old
case Step s b
r of
Partial s
s1 -> s -> t -> Ring a -> Ptr a -> m b
consumeRing s
s1 (t
n forall a. Num a => a -> a -> a
- t
1) Ring a
rb Ptr a
rh1
Done b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return b
b
case SplitOnSeqState s a (Ring a) (Ptr a) Word ck
state of
SplitOnSeqEmpty s
s -> s -> m b
fextract s
s
SplitOnSeqSingle s
s a
_ -> s -> m b
fextract s
s
SplitOnSeqWord s
s Int
idx Word
wrd -> s -> Int -> Word -> m b
consumeWord s
s Int
idx Word
wrd
SplitOnSeqWordLoop s
s Word
wrd -> s -> Int -> Word -> m b
consumeWord s
s Int
patLen Word
wrd
SplitOnSeqKR s
s Int
idx Ring a
rb Ptr a
_ -> forall {t}. (Eq t, Num t) => s -> t -> Ring a -> Ptr a -> m b
consumeRing s
s Int
idx Ring a
rb (forall a. Ring a -> Ptr a
Ring.startOf Ring a
rb)
SplitOnSeqKRLoop s
s ck
_ Ring a
rb Ptr a
rh -> forall {t}. (Eq t, Num t) => s -> t -> Ring a -> Ptr a -> m b
consumeRing s
s Int
patLen Ring a
rb Ptr a
rh
{-# INLINE tee #-}
tee :: Monad m => Fold m a b -> Fold m a c -> Fold m a (b,c)
tee :: forall (m :: * -> *) a b c.
Monad m =>
Fold m a b -> Fold m a c -> Fold m a (b, c)
tee = forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWith (,)
{-# INLINE distribute #-}
distribute :: Monad m => [Fold m a b] -> Fold m a [b]
distribute :: forall (m :: * -> *) a b. Monad m => [Fold m a b] -> Fold m a [b]
distribute = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
Prelude.foldr (forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWith (:)) (forall (m :: * -> *) b a. Applicative m => b -> Fold m a b
fromPure [])
{-# INLINE partitionByMUsing #-}
partitionByMUsing :: Monad m =>
( (x -> y -> (x, y))
-> Fold m (Either b c) x
-> Fold m (Either b c) y
-> Fold m (Either b c) (x, y)
)
-> (a -> m (Either b c))
-> Fold m b x
-> Fold m c y
-> Fold m a (x, y)
partitionByMUsing :: forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Fold m (Either b c) x
-> Fold m (Either b c) y
-> Fold m (Either b c) (x, y))
-> (a -> m (Either b c))
-> Fold m b x
-> Fold m c y
-> Fold m a (x, y)
partitionByMUsing (x -> y -> (x, y))
-> Fold m (Either b c) x
-> Fold m (Either b c) y
-> Fold m (Either b c) (x, y)
t a -> m (Either b c)
f Fold m b x
fld1 Fold m c y
fld2 =
let l :: Fold m (Either b b) x
l = forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (forall a b. a -> Either a b -> a
fromLeft forall a. HasCallStack => a
undefined) Fold m b x
fld1
r :: Fold m (Either a c) y
r = forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap (forall b a. b -> Either a b -> b
fromRight forall a. HasCallStack => a
undefined) Fold m c y
fld2
in forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Fold m b r -> Fold m a r
lmapM a -> m (Either b c)
f ((x -> y -> (x, y))
-> Fold m (Either b c) x
-> Fold m (Either b c) y
-> Fold m (Either b c) (x, y)
t (,) (forall (m :: * -> *) a b.
Monad m =>
(a -> Bool) -> Fold m a b -> Fold m a b
filter forall a b. Either a b -> Bool
isLeft forall {b}. Fold m (Either b b) x
l) (forall (m :: * -> *) a b.
Monad m =>
(a -> Bool) -> Fold m a b -> Fold m a b
filter forall a b. Either a b -> Bool
isRight forall {a}. Fold m (Either a c) y
r))
{-# INLINE partitionByM #-}
partitionByM :: Monad m
=> (a -> m (Either b c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionByM :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (Either b c))
-> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionByM = forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Fold m (Either b c) x
-> Fold m (Either b c) y
-> Fold m (Either b c) (x, y))
-> (a -> m (Either b c))
-> Fold m b x
-> Fold m c y
-> Fold m a (x, y)
partitionByMUsing forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWith
{-# INLINE partitionByFstM #-}
partitionByFstM :: Monad m
=> (a -> m (Either b c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionByFstM :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (Either b c))
-> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionByFstM = forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Fold m (Either b c) x
-> Fold m (Either b c) y
-> Fold m (Either b c) (x, y))
-> (a -> m (Either b c))
-> Fold m b x
-> Fold m c y
-> Fold m a (x, y)
partitionByMUsing forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWithFst
{-# INLINE partitionByMinM #-}
partitionByMinM :: Monad m =>
(a -> m (Either b c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionByMinM :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (Either b c))
-> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionByMinM = forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Fold m (Either b c) x
-> Fold m (Either b c) y
-> Fold m (Either b c) (x, y))
-> (a -> m (Either b c))
-> Fold m b x
-> Fold m c y
-> Fold m a (x, y)
partitionByMUsing forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWithMin
{-# INLINE partitionBy #-}
partitionBy :: Monad m
=> (a -> Either b c) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionBy :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> Either b c) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionBy a -> Either b c
f = forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (Either b c))
-> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionByM (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either b c
f)
{-# INLINE partition #-}
partition :: Monad m
=> Fold m b x -> Fold m c y -> Fold m (Either b c) (x, y)
partition :: forall (m :: * -> *) b x c y.
Monad m =>
Fold m b x -> Fold m c y -> Fold m (Either b c) (x, y)
partition = forall (m :: * -> *) a b c x y.
Monad m =>
(a -> Either b c) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
partitionBy forall a. a -> a
id
{-# INLINE unzipWithMUsing #-}
unzipWithMUsing :: Monad m =>
( (x -> y -> (x, y))
-> Fold m (b, c) x
-> Fold m (b, c) y
-> Fold m (b, c) (x, y)
)
-> (a -> m (b, c))
-> Fold m b x
-> Fold m c y
-> Fold m a (x, y)
unzipWithMUsing :: forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Fold m (b, c) x -> Fold m (b, c) y -> Fold m (b, c) (x, y))
-> (a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithMUsing (x -> y -> (x, y))
-> Fold m (b, c) x -> Fold m (b, c) y -> Fold m (b, c) (x, y)
t a -> m (b, c)
f Fold m b x
fld1 Fold m c y
fld2 =
let f1 :: Fold m (b, b) x
f1 = forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap forall a b. (a, b) -> a
fst Fold m b x
fld1
f2 :: Fold m (a, c) y
f2 = forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap forall a b. (a, b) -> b
snd Fold m c y
fld2
in forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Fold m b r -> Fold m a r
lmapM a -> m (b, c)
f ((x -> y -> (x, y))
-> Fold m (b, c) x -> Fold m (b, c) y -> Fold m (b, c) (x, y)
t (,) forall {b}. Fold m (b, b) x
f1 forall {a}. Fold m (a, c) y
f2)
{-# INLINE unzipWithM #-}
unzipWithM :: Monad m
=> (a -> m (b,c)) -> Fold m b x -> Fold m c y -> Fold m a (x,y)
unzipWithM :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithM = forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Fold m (b, c) x -> Fold m (b, c) y -> Fold m (b, c) (x, y))
-> (a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithMUsing forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWith
{-# INLINE unzipWithFstM #-}
unzipWithFstM :: Monad m =>
(a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithFstM :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithFstM = forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Fold m (b, c) x -> Fold m (b, c) y -> Fold m (b, c) (x, y))
-> (a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithMUsing forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWithFst
{-# INLINE unzipWithMinM #-}
unzipWithMinM :: Monad m =>
(a -> m (b,c)) -> Fold m b x -> Fold m c y -> Fold m a (x,y)
unzipWithMinM :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithMinM = forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Fold m (b, c) x -> Fold m (b, c) y -> Fold m (b, c) (x, y))
-> (a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithMUsing forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
teeWithMin
{-# INLINE unzipWith #-}
unzipWith :: Monad m
=> (a -> (b,c)) -> Fold m b x -> Fold m c y -> Fold m a (x,y)
unzipWith :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWith a -> (b, c)
f = forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWithM (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, c)
f)
{-# INLINE unzip #-}
unzip :: Monad m => Fold m a x -> Fold m b y -> Fold m (a,b) (x,y)
unzip :: forall (m :: * -> *) a x b y.
Monad m =>
Fold m a x -> Fold m b y -> Fold m (a, b) (x, y)
unzip = forall (m :: * -> *) a b c x y.
Monad m =>
(a -> (b, c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
unzipWith forall a. a -> a
id
{-# INLINE zipStreamWithM #-}
zipStreamWithM ::
(a -> b -> m c) -> Stream m a -> Fold m c x -> Fold m b x
zipStreamWithM :: forall a b (m :: * -> *) c x.
(a -> b -> m c) -> Stream m a -> Fold m c x -> Fold m b x
zipStreamWithM = forall a. HasCallStack => a
undefined
{-# INLINE zipStream #-}
zipStream :: Monad m => Stream m a -> Fold m (a, b) x -> Fold m b x
zipStream :: forall (m :: * -> *) a b x.
Monad m =>
Stream m a -> Fold m (a, b) x -> Fold m b x
zipStream = forall a b (m :: * -> *) c x.
(a -> b -> m c) -> Stream m a -> Fold m c x -> Fold m b x
zipStreamWithM (forall a b c. ((a, b) -> c) -> a -> b -> c
curry forall (m :: * -> *) a. Monad m => a -> m a
return)
{-# INLINE indexingWith #-}
indexingWith :: Monad m => Int -> (Int -> Int) -> Fold m a (Maybe (Int, a))
indexingWith :: forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Int) -> Fold m a (Maybe (Int, a))
indexingWith Int
i Int -> Int
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Maybe' a -> Maybe a
toMaybe forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
foldl' forall {b} {b}. Maybe' (Int, b) -> b -> Maybe' (Int, b)
step forall a. Maybe' a
initial
where
initial :: Maybe' a
initial = forall a. Maybe' a
Nothing'
step :: Maybe' (Int, b) -> b -> Maybe' (Int, b)
step Maybe' (Int, b)
Nothing' b
a = forall a. a -> Maybe' a
Just' (Int
i, b
a)
step (Just' (Int
n, b
_)) b
a = forall a. a -> Maybe' a
Just' (Int -> Int
f Int
n, b
a)
{-# INLINE indexing #-}
indexing :: Monad m => Fold m a (Maybe (Int, a))
indexing :: forall (m :: * -> *) a. Monad m => Fold m a (Maybe (Int, a))
indexing = forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Int) -> Fold m a (Maybe (Int, a))
indexingWith Int
0 (forall a. Num a => a -> a -> a
+ Int
1)
{-# INLINE indexingRev #-}
indexingRev :: Monad m => Int -> Fold m a (Maybe (Int, a))
indexingRev :: forall (m :: * -> *) a. Monad m => Int -> Fold m a (Maybe (Int, a))
indexingRev Int
n = forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Int) -> Fold m a (Maybe (Int, a))
indexingWith Int
n (forall a. Num a => a -> a -> a
subtract Int
1)
{-# INLINE indexed #-}
indexed :: Monad m => Fold m (Int, a) b -> Fold m a b
indexed :: forall (m :: * -> *) a b.
Monad m =>
Fold m (Int, a) b -> Fold m a b
indexed = forall (m :: * -> *) a b c.
Monad m =>
Fold m a (Maybe b) -> Fold m b c -> Fold m a c
scanMaybe forall (m :: * -> *) a. Monad m => Fold m a (Maybe (Int, a))
indexing
{-# INLINE with #-}
with ::
(Fold m (s, a) b -> Fold m a b)
-> (((s, a) -> c) -> Fold m (s, a) b -> Fold m (s, a) b)
-> (((s, a) -> c) -> Fold m a b -> Fold m a b)
with :: forall (m :: * -> *) s a b c.
(Fold m (s, a) b -> Fold m a b)
-> (((s, a) -> c) -> Fold m (s, a) b -> Fold m (s, a) b)
-> ((s, a) -> c)
-> Fold m a b
-> Fold m a b
with Fold m (s, a) b -> Fold m a b
f ((s, a) -> c) -> Fold m (s, a) b -> Fold m (s, a) b
comb (s, a) -> c
g = Fold m (s, a) b -> Fold m a b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((s, a) -> c) -> Fold m (s, a) b -> Fold m (s, a) b
comb (s, a) -> c
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
lmap forall a b. (a, b) -> b
snd
{-# INLINE sampleFromthen #-}
sampleFromthen :: Monad m => Int -> Int -> Fold m a b -> Fold m a b
sampleFromthen :: forall (m :: * -> *) a b.
Monad m =>
Int -> Int -> Fold m a b -> Fold m a b
sampleFromthen Int
offset Int
size =
forall (m :: * -> *) s a b c.
(Fold m (s, a) b -> Fold m a b)
-> (((s, a) -> c) -> Fold m (s, a) b -> Fold m (s, a) b)
-> ((s, a) -> c)
-> Fold m a b
-> Fold m a b
with forall (m :: * -> *) a b.
Monad m =>
Fold m (Int, a) b -> Fold m a b
indexed forall (m :: * -> *) a b.
Monad m =>
(a -> Bool) -> Fold m a b -> Fold m a b
filter (\(Int
i, a
_) -> (Int
i forall a. Num a => a -> a -> a
+ Int
offset) forall a. Integral a => a -> a -> a
`mod` Int
size forall a. Eq a => a -> a -> Bool
== Int
0)
{-# INLINE concatSequence #-}
concatSequence ::
Fold m b c -> t (Fold m a b) -> Fold m a c
concatSequence :: forall (m :: * -> *) b c (t :: * -> *) a.
Fold m b c -> t (Fold m a b) -> Fold m a c
concatSequence Fold m b c
_f t (Fold m a b)
_p = forall a. HasCallStack => a
undefined
{-# INLINE chunksBetween #-}
chunksBetween ::
Int -> Int -> Fold m a b -> Fold m b c -> Fold m a c
chunksBetween :: forall (m :: * -> *) a b c.
Int -> Int -> Fold m a b -> Fold m b c -> Fold m a c
chunksBetween Int
_low Int
_high Fold m a b
_f1 Fold m b c
_f2 = forall a. HasCallStack => a
undefined
{-# INLINE toStream #-}
toStream :: (Monad m, Monad n) => Fold m a (Stream n a)
toStream :: forall (m :: * -> *) (n :: * -> *) a.
(Monad m, Monad n) =>
Fold m a (Stream n a)
toStream = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (m :: * -> *) a. Applicative m => [a] -> Stream m a
StreamD.fromList forall (m :: * -> *) a. Monad m => Fold m a [a]
toList
{-# INLINE toStreamRev #-}
toStreamRev :: (Monad m, Monad n) => Fold m a (Stream n a)
toStreamRev :: forall (m :: * -> *) (n :: * -> *) a.
(Monad m, Monad n) =>
Fold m a (Stream n a)
toStreamRev = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (m :: * -> *) a. Applicative m => [a] -> Stream m a
StreamD.fromList forall (m :: * -> *) a. Monad m => Fold m a [a]
toListRev
{-# INLINE unfoldMany #-}
unfoldMany :: Monad m => Unfold m a b -> Fold m b c -> Fold m a c
unfoldMany :: forall (m :: * -> *) a b c.
Monad m =>
Unfold m a b -> Fold m b c -> Fold m a c
unfoldMany (Unfold s -> m (Step s b)
ustep a -> m s
inject) (Fold s -> b -> m (Step s c)
fstep m (Step s c)
initial s -> m c
extract) =
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold s -> a -> m (Step s c)
consume m (Step s c)
initial s -> m c
extract
where
{-# INLINE produce #-}
produce :: s -> s -> m (Step s c)
produce s
fs s
us = do
Step s b
ures <- s -> m (Step s b)
ustep s
us
case Step s b
ures of
StreamD.Yield b
b s
us1 -> do
Step s c
fres <- s -> b -> m (Step s c)
fstep s
fs b
b
case Step s c
fres of
Partial s
fs1 -> s -> s -> m (Step s c)
produce s
fs1 s
us1
Done c
c -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done c
c
StreamD.Skip s
us1 -> s -> s -> m (Step s c)
produce s
fs s
us1
Step s b
StreamD.Stop -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial s
fs
{-# INLINE_LATE consume #-}
consume :: s -> a -> m (Step s c)
consume s
s a
a = a -> m s
inject a
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= s -> s -> m (Step s c)
produce s
s
{-# INLINE bottomBy #-}
bottomBy :: (MonadIO m, Unbox a) =>
(a -> a -> Ordering)
-> Int
-> Fold m a (MutArray a)
bottomBy :: forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Fold m a (MutArray a)
bottomBy a -> a -> Ordering
cmp Int
n = forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold forall {m :: * -> *} {b}.
MonadIO m =>
(MutArray a, Int) -> a -> m (Step (MutArray a, Int) b)
step m (Step (MutArray a, Int) (MutArray a))
initial forall {b} {b}. (b, b) -> m b
extract
where
initial :: m (Step (MutArray a, Int) (MutArray a))
initial = do
MutArray a
arr <- forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> m (MutArray a)
MA.newPinned Int
n
if Int
n forall a. Ord 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 b. b -> Step s b
Done MutArray a
arr
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial (MutArray a
arr, Int
0)
step :: (MutArray a, Int) -> a -> m (Step (MutArray a, Int) b)
step (MutArray a
arr, Int
i) a
x =
if Int
i forall a. Ord a => a -> a -> Bool
< Int
n
then do
MutArray a
arr' <- forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
MutArray a -> a -> m (MutArray a)
MA.snoc MutArray a
arr a
x
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> MutArray a -> m ()
MA.bubble a -> a -> Ordering
cmp MutArray a
arr'
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial (MutArray a
arr', Int
i forall a. Num a => a -> a -> a
+ Int
1)
else do
a
x1 <- forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> MutArray a -> m a
MA.getIndexUnsafe (Int
i forall a. Num a => a -> a -> a
- Int
1) MutArray a
arr
case a
x a -> a -> Ordering
`cmp` a
x1 of
Ordering
LT -> do
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> MutArray a -> a -> m ()
MA.putIndexUnsafe (Int
i forall a. Num a => a -> a -> a
- Int
1) MutArray a
arr a
x
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> MutArray a -> m ()
MA.bubble a -> a -> Ordering
cmp MutArray a
arr
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial (MutArray a
arr, Int
i)
Ordering
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial (MutArray a
arr, Int
i)
extract :: (b, b) -> m b
extract = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst
{-# INLINE topBy #-}
topBy :: (MonadIO m, Unbox a) =>
(a -> a -> Ordering)
-> Int
-> Fold m a (MutArray a)
topBy :: forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Fold m a (MutArray a)
topBy a -> a -> Ordering
cmp = forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Fold m a (MutArray a)
bottomBy (forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> a -> Ordering
cmp)
{-# INLINE top #-}
top :: (MonadIO m, Unbox a, Ord a) => Int -> Fold m a (MutArray a)
top :: forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Fold m a (MutArray a)
top = forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Fold m a (MutArray a)
bottomBy forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. Ord a => a -> a -> Ordering
compare
{-# INLINE bottom #-}
bottom :: (MonadIO m, Unbox a, Ord a) => Int -> Fold m a (MutArray a)
bottom :: forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Fold m a (MutArray a)
bottom = forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Fold m a (MutArray a)
bottomBy forall a. Ord a => a -> a -> Ordering
compare
data IntersperseQState fs ps =
IntersperseQUnquoted !fs !ps
| IntersperseQQuoted !fs !ps
| IntersperseQQuotedEsc !fs !ps
{-# INLINE intersperseWithQuotes #-}
intersperseWithQuotes :: (Monad m, Eq a) =>
a -> a -> a -> Fold m a b -> Fold m b c -> Fold m a c
intersperseWithQuotes :: forall (m :: * -> *) a b c.
(Monad m, Eq a) =>
a -> a -> a -> Fold m a b -> Fold m b c -> Fold m a c
intersperseWithQuotes
a
quote
a
esc
a
separator
(Fold s -> a -> m (Step s b)
stepL m (Step s b)
initialL s -> m b
extractL)
(Fold s -> b -> m (Step s c)
stepR m (Step s c)
initialR s -> m c
extractR) = forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> Fold m a b
Fold IntersperseQState s s -> a -> m (Step (IntersperseQState s s) c)
step m (Step (IntersperseQState s s) c)
initial forall {ps}. IntersperseQState s ps -> m c
extract
where
errMsg :: [Char] -> [Char] -> a
errMsg [Char]
p [Char]
status =
forall a. HasCallStack => [Char] -> a
error forall a b. (a -> b) -> a -> b
$ [Char]
"intersperseWithQuotes: " forall a. [a] -> [a] -> [a]
++ [Char]
p forall a. [a] -> [a] -> [a]
++ [Char]
" parsing fold cannot "
forall a. [a] -> [a] -> [a]
++ [Char]
status forall a. [a] -> [a] -> [a]
++ [Char]
" without input"
{-# INLINE initL #-}
initL :: (s -> s) -> m (Step s b)
initL s -> s
mkState = do
Step s b
resL <- m (Step s b)
initialL
case Step s b
resL of
Partial s
sL ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial forall a b. (a -> b) -> a -> b
$ s -> s
mkState s
sL
Done b
_ ->
forall {a}. [Char] -> [Char] -> a
errMsg [Char]
"content" [Char]
"succeed"
initial :: m (Step (IntersperseQState s s) c)
initial = do
Step s c
res <- m (Step s c)
initialR
case Step s c
res of
Partial s
sR -> forall {s} {b}. (s -> s) -> m (Step s b)
initL (forall fs ps. fs -> ps -> IntersperseQState fs ps
IntersperseQUnquoted s
sR)
Done c
b -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. b -> Step s b
Done c
b
{-# INLINE collect #-}
collect :: (s -> s -> s) -> s -> b -> m (Step s c)
collect s -> s -> s
nextS s
sR b
b = do
Step s c
res <- s -> b -> m (Step s c)
stepR s
sR b
b
case Step s c
res of
Partial s
s ->
forall {s} {b}. (s -> s) -> m (Step s b)
initL (s -> s -> s
nextS s
s)
Done c
c -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall s b. b -> Step s b
Done c
c)
{-# INLINE process #-}
process :: a -> s -> s -> (s -> s -> s) -> m (Step s c)
process a
a s
sL s
sR s -> s -> s
nextState = do
Step s b
r <- s -> a -> m (Step s b)
stepL s
sL a
a
case Step s b
r of
Partial s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial (s -> s -> s
nextState s
sR s
s)
Done b
b -> forall {s}. (s -> s -> s) -> s -> b -> m (Step s c)
collect s -> s -> s
nextState s
sR b
b
{-# INLINE processQuoted #-}
processQuoted :: a -> s -> t -> (t -> s -> s) -> m (Step s b)
processQuoted a
a s
sL t
sR t -> s -> s
nextState = do
Step s b
r <- s -> a -> m (Step s b)
stepL s
sL a
a
case Step s b
r of
Partial s
s -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s b. s -> Step s b
Partial (t -> s -> s
nextState t
sR s
s)
Done b
_ -> forall a. HasCallStack => [Char] -> a
error [Char]
"Collecting fold finished inside quote"
step :: IntersperseQState s s -> a -> m (Step (IntersperseQState s s) c)
step (IntersperseQUnquoted s
sR s
sL) a
a
| a
a forall a. Eq a => a -> a -> Bool
== a
separator = do
b
b <- s -> m b
extractL s
sL
forall {s}. (s -> s -> s) -> s -> b -> m (Step s c)
collect forall fs ps. fs -> ps -> IntersperseQState fs ps
IntersperseQUnquoted s
sR b
b
| a
a forall a. Eq a => a -> a -> Bool
== a
quote = forall {t} {s} {b}. a -> s -> t -> (t -> s -> s) -> m (Step s b)
processQuoted a
a s
sL s
sR forall fs ps. fs -> ps -> IntersperseQState fs ps
IntersperseQQuoted
| Bool
otherwise = forall {s}. a -> s -> s -> (s -> s -> s) -> m (Step s c)
process a
a s
sL s
sR forall fs ps. fs -> ps -> IntersperseQState fs ps
IntersperseQUnquoted
step (IntersperseQQuoted s
sR s
sL) a
a
| a
a forall a. Eq a => a -> a -> Bool
== a
esc = forall {t} {s} {b}. a -> s -> t -> (t -> s -> s) -> m (Step s b)
processQuoted a
a s
sL s
sR forall fs ps. fs -> ps -> IntersperseQState fs ps
IntersperseQQuotedEsc
| a
a forall a. Eq a => a -> a -> Bool
== a
quote = forall {s}. a -> s -> s -> (s -> s -> s) -> m (Step s c)
process a
a s
sL s
sR forall fs ps. fs -> ps -> IntersperseQState fs ps
IntersperseQUnquoted
| Bool
otherwise = forall {t} {s} {b}. a -> s -> t -> (t -> s -> s) -> m (Step s b)
processQuoted a
a s
sL s
sR forall fs ps. fs -> ps -> IntersperseQState fs ps
IntersperseQQuoted
step (IntersperseQQuotedEsc s
sR s
sL) a
a =
forall {t} {s} {b}. a -> s -> t -> (t -> s -> s) -> m (Step s b)
processQuoted a
a s
sL s
sR forall fs ps. fs -> ps -> IntersperseQState fs ps
IntersperseQQuoted
extract :: IntersperseQState s ps -> m c
extract (IntersperseQUnquoted s
sR ps
_) = s -> m c
extractR s
sR
extract (IntersperseQQuoted s
_ ps
_) =
forall a. HasCallStack => [Char] -> a
error [Char]
"intersperseWithQuotes: finished inside quote"
extract (IntersperseQQuotedEsc s
_ ps
_) =
forall a. HasCallStack => [Char] -> a
error [Char]
"intersperseWithQuotes: finished inside quote, at escape char"