{-# LANGUAGE CPP #-}
module Streamly.Internal.Data.Scanl.Combinators
(
sconcat
, mconcat
, foldMap
, foldMapM
, drainMapM
, the
, mean
, rollingHash
, defaultSalt
, rollingHashWithSalt
, rollingHashFirstN
, sum
, product
, toListRev
, toStream
, toStreamRev
, topBy
, top
, bottomBy
, bottom
, indexingWith
, indexing
, indexingRev
, rollingMap
, rollingMapM
, deleteBy
, uniqBy
, uniq
, repeated
, findIndices
, elemIndices
, drainN
, takingEndByM
, takingEndBy
, takingEndByM_
, takingEndBy_
, droppingWhileM
, droppingWhile
, prune
, with
, scanl
, scanlMany
, pipe
, indexed
, zipStreamWithM
, zipStream
, mapMaybeM
, mapMaybe
, sampleFromthen
, tee
, distribute
, unzip
, unzipWith
, unzipWithM
, partitionByM
, partitionBy
, partition
, unfoldMany
)
where
#include "inline.hs"
#include "ArrayMacros.h"
import Control.Monad.IO.Class (MonadIO(..))
import Data.Bifunctor (first)
import Data.Int (Int64)
import Streamly.Internal.Data.Unbox (Unbox(..))
import Streamly.Internal.Data.MutArray.Type (MutArray(..))
import Streamly.Internal.Data.Maybe.Strict (Maybe'(..), toMaybe)
import Streamly.Internal.Data.Pipe.Type (Pipe (..))
import Streamly.Internal.Data.Stream.Type (Stream)
import Streamly.Internal.Data.Tuple.Strict (Tuple'(..))
import Streamly.Internal.Data.Unfold.Type (Unfold(..))
import qualified Prelude
import qualified Streamly.Internal.Data.MutArray.Type as MA
import qualified Streamly.Internal.Data.Scanl.Window as Scanl
import qualified Streamly.Internal.Data.Pipe.Type as Pipe
import qualified Streamly.Internal.Data.Stream.Type as StreamD
import Streamly.Internal.Data.Scanl.Type
import Prelude hiding
( Foldable(..), filter, drop, dropWhile, take, takeWhile, zipWith
, map, mapM_, sequence, all, any
, notElem, head, last, tail
, reverse, iterate, init, and, or, lookup, (!!)
, scanl, scanl1, replicate, concatMap, mconcat, unzip
, span, splitAt, break, mapM, zip, maybe, const)
#include "DocTestDataScanl.hs"
{-# INLINE mapMaybeM #-}
mapMaybeM :: Monad m => (a -> m (Maybe b)) -> Scanl m b r -> Scanl m a r
mapMaybeM :: forall (m :: * -> *) a b r.
Monad m =>
(a -> m (Maybe b)) -> Scanl m b r -> Scanl m a r
mapMaybeM a -> m (Maybe b)
f = (a -> m (Maybe b)) -> Scanl m (Maybe b) r -> Scanl m a r
forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Scanl m b r -> Scanl m a r
lmapM a -> m (Maybe b)
f (Scanl m (Maybe b) r -> Scanl m a r)
-> (Scanl m b r -> Scanl m (Maybe b) r)
-> Scanl m b r
-> Scanl m a r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scanl m b r -> Scanl m (Maybe b) r
forall (m :: * -> *) a b.
Monad m =>
Scanl m a b -> Scanl m (Maybe a) b
catMaybes
{-# INLINE mapMaybe #-}
mapMaybe :: Monad m => (a -> Maybe b) -> Scanl m b r -> Scanl m a r
mapMaybe :: forall (m :: * -> *) a b r.
Monad m =>
(a -> Maybe b) -> Scanl m b r -> Scanl m a r
mapMaybe a -> Maybe b
f = (a -> Maybe b) -> Scanl m (Maybe b) r -> Scanl m a r
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
lmap a -> Maybe b
f (Scanl m (Maybe b) r -> Scanl m a r)
-> (Scanl m b r -> Scanl m (Maybe b) r)
-> Scanl m b r
-> Scanl m a r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scanl m b r -> Scanl m (Maybe b) r
forall (m :: * -> *) a b.
Monad m =>
Scanl m a b -> Scanl m (Maybe a) b
catMaybes
{-# INLINE pipe #-}
pipe :: Monad m => Pipe m a b -> Scanl m b c -> Scanl m a c
pipe :: forall (m :: * -> *) a b c.
Monad m =>
Pipe m a b -> Scanl m b c -> Scanl m a c
pipe (Pipe cs -> a -> m (Step cs ps b)
consume ps -> m (Step cs ps b)
produce cs
pinitial) (Scanl s -> b -> m (Step s c)
fstep m (Step s c)
finitial s -> m c
fextract s -> m c
ffinal) =
(Tuple' cs s -> a -> m (Step (Tuple' cs s) c))
-> m (Step (Tuple' cs s) c)
-> (Tuple' cs s -> m c)
-> (Tuple' cs s -> m c)
-> Scanl m a c
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl Tuple' cs s -> a -> m (Step (Tuple' cs s) c)
step m (Step (Tuple' cs s) c)
initial Tuple' cs s -> m c
forall {a}. Tuple' a s -> m c
extract Tuple' cs s -> m c
forall {a}. Tuple' a s -> m c
final
where
initial :: m (Step (Tuple' cs s) c)
initial = (s -> Tuple' cs s) -> Step s c -> Step (Tuple' cs s) c
forall a b c. (a -> b) -> Step a c -> Step b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (cs -> s -> Tuple' cs s
forall a b. a -> b -> Tuple' a b
Tuple' cs
pinitial) (Step s c -> Step (Tuple' cs s) c)
-> m (Step s c) -> m (Step (Tuple' cs s) c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Step s c)
finitial
step :: Tuple' cs s -> a -> m (Step (Tuple' cs s) c)
step (Tuple' cs
cs s
fs) a
x = do
Step cs ps b
r <- cs -> a -> m (Step cs ps b)
consume cs
cs a
x
s -> Step cs ps b -> m (Step (Tuple' cs s) c)
go s
fs Step cs ps b
r
where
go :: s -> Step cs ps b -> m (Step (Tuple' cs s) c)
go s
acc (Pipe.YieldC cs
cs1 b
b) = do
Step s c
acc1 <- s -> b -> m (Step s c)
fstep s
acc b
b
Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c))
-> Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c)
forall a b. (a -> b) -> a -> b
$ case Step s c
acc1 of
Partial s
s -> Tuple' cs s -> Step (Tuple' cs s) c
forall s b. s -> Step s b
Partial (Tuple' cs s -> Step (Tuple' cs s) c)
-> Tuple' cs s -> Step (Tuple' cs s) c
forall a b. (a -> b) -> a -> b
$ cs -> s -> Tuple' cs s
forall a b. a -> b -> Tuple' a b
Tuple' cs
cs1 s
s
Done c
b1 -> c -> Step (Tuple' cs s) c
forall s b. b -> Step s b
Done c
b1
go s
acc (Pipe.YieldP ps
ps1 b
b) = do
Step s c
acc1 <- s -> b -> m (Step s c)
fstep s
acc b
b
Step cs ps b
r <- ps -> m (Step cs ps b)
produce ps
ps1
case Step s c
acc1 of
Partial s
s -> s -> Step cs ps b -> m (Step (Tuple' cs s) c)
go s
s Step cs ps b
r
Done c
b1 -> Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c))
-> Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c)
forall a b. (a -> b) -> a -> b
$ c -> Step (Tuple' cs s) c
forall s b. b -> Step s b
Done c
b1
go s
acc (Pipe.SkipC cs
cs1) =
Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c))
-> Step (Tuple' cs s) c -> m (Step (Tuple' cs s) c)
forall a b. (a -> b) -> a -> b
$ Tuple' cs s -> Step (Tuple' cs s) c
forall s b. s -> Step s b
Partial (Tuple' cs s -> Step (Tuple' cs s) c)
-> Tuple' cs s -> Step (Tuple' cs s) c
forall a b. (a -> b) -> a -> b
$ cs -> s -> Tuple' cs s
forall a b. a -> b -> Tuple' a b
Tuple' cs
cs1 s
acc
go s
acc (Pipe.SkipP ps
ps1) = do
Step cs ps b
r <- ps -> m (Step cs ps b)
produce ps
ps1
s -> Step cs ps b -> m (Step (Tuple' cs s) c)
go s
acc Step cs ps b
r
go s
acc Step cs ps b
Pipe.Stop = c -> Step (Tuple' cs s) c
forall s b. b -> Step s b
Done (c -> Step (Tuple' cs s) c) -> m c -> m (Step (Tuple' cs s) c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m c
ffinal s
acc
extract :: Tuple' a s -> m c
extract (Tuple' a
_ s
fs) = s -> m c
fextract s
fs
final :: Tuple' a s -> m c
final (Tuple' a
_ s
fs) = s -> m c
ffinal s
fs
{-# INLINE scanWith #-}
scanWith :: Monad m => Bool -> Scanl m a b -> Scanl m b c -> Scanl m a c
scanWith :: forall (m :: * -> *) a b c.
Monad m =>
Bool -> Scanl m a b -> Scanl m b c -> Scanl m a c
scanWith Bool
isMany
(Scanl s -> a -> m (Step s b)
stepL m (Step s b)
initialL s -> m b
extractL s -> m b
finalL)
(Scanl s -> b -> m (Step s c)
stepR m (Step s c)
initialR s -> m c
extractR s -> m c
finalR) =
((s, s) -> a -> m (Step (s, s) c))
-> m (Step (s, s) c)
-> ((s, s) -> m c)
-> ((s, s) -> m c)
-> Scanl m a c
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl (s, s) -> a -> m (Step (s, s) c)
step m (Step (s, s) c)
initial (s, s) -> m c
forall {a}. (a, s) -> m c
extract (s, s) -> m c
final
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 c -> Step (s, s) c
forall s b. b -> Step s b
Done (c -> Step (s, s) c) -> m c -> m (Step (s, s) c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s -> m c
finalR s
sR1
Done c
bR -> Step (s, s) c -> m (Step (s, s) c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (s, s) c -> m (Step (s, s) c))
-> Step (s, s) c -> m (Step (s, s) c)
forall a b. (a -> b) -> a -> b
$ c -> Step (s, s) c
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
case Step s c
rR of
Partial s
sR1 -> Step (s, s) c -> m (Step (s, s) c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (s, s) c -> m (Step (s, s) c))
-> Step (s, s) c -> m (Step (s, s) c)
forall a b. (a -> b) -> a -> b
$ (s, s) -> Step (s, s) c
forall s b. s -> Step s b
Partial (s
sL, s
sR1)
Done c
bR -> s -> m b
finalL s
sL m b -> m (Step (s, s) c) -> m (Step (s, s) c)
forall a b. m a -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Step (s, s) c -> m (Step (s, s) c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> Step (s, s) c
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 -> Step (s, s) c -> m (Step (s, s) c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (s, s) c -> m (Step (s, s) c))
-> Step (s, s) c -> m (Step (s, s) c)
forall a b. (a -> b) -> a -> b
$ c -> Step (s, s) c
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 (s -> m c) -> ((a, s) -> s) -> (a, s) -> m c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, s) -> s
forall a b. (a, b) -> b
snd
final :: (s, s) -> m c
final (s
sL, s
sR) = s -> m b
finalL s
sL m b -> m c -> m c
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> s -> m c
finalR s
sR
{-# INLINE scanl #-}
scanl :: Monad m => Scanl m a b -> Scanl m b c -> Scanl m a c
scanl :: forall (m :: * -> *) a b c.
Monad m =>
Scanl m a b -> Scanl m b c -> Scanl m a c
scanl = Bool -> Scanl m a b -> Scanl m b c -> Scanl m a c
forall (m :: * -> *) a b c.
Monad m =>
Bool -> Scanl m a b -> Scanl m b c -> Scanl m a c
scanWith Bool
False
{-# INLINE scanlMany #-}
scanlMany :: Monad m => Scanl m a b -> Scanl m b c -> Scanl m a c
scanlMany :: forall (m :: * -> *) a b c.
Monad m =>
Scanl m a b -> Scanl m b c -> Scanl m a c
scanlMany = Bool -> Scanl m a b -> Scanl m b c -> Scanl m a c
forall (m :: * -> *) a b c.
Monad m =>
Bool -> Scanl m a b -> Scanl m b c -> Scanl m a c
scanWith Bool
True
{-# INLINE_NORMAL deleteBy #-}
deleteBy :: Monad m => (a -> a -> Bool) -> a -> Scanl m a (Maybe a)
deleteBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Bool) -> a -> Scanl m a (Maybe a)
deleteBy a -> a -> Bool
eq a
x0 = (Tuple' Bool (Maybe a) -> Maybe a)
-> Scanl m a (Tuple' Bool (Maybe a)) -> Scanl m a (Maybe a)
forall a b. (a -> b) -> Scanl m a a -> Scanl m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Tuple' Bool (Maybe a) -> Maybe a
forall {a} {b}. Tuple' a b -> b
extract (Scanl m a (Tuple' Bool (Maybe a)) -> Scanl m a (Maybe a))
-> Scanl m a (Tuple' Bool (Maybe a)) -> Scanl m a (Maybe a)
forall a b. (a -> b) -> a -> b
$ (Tuple' Bool (Maybe a) -> a -> Tuple' Bool (Maybe a))
-> Tuple' Bool (Maybe a) -> Scanl m a (Tuple' Bool (Maybe a))
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
mkScanl Tuple' Bool (Maybe a) -> a -> Tuple' Bool (Maybe a)
forall {b}. Tuple' Bool b -> a -> Tuple' Bool (Maybe a)
step (Bool -> Maybe a -> Tuple' Bool (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' Bool
False Maybe a
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 Bool -> Maybe a -> Tuple' Bool (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' Bool
True Maybe a
forall a. Maybe a
Nothing
else Bool -> Maybe a -> Tuple' Bool (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' Bool
False (a -> Maybe a
forall a. a -> Maybe a
Just a
x)
step (Tuple' Bool
True b
_) a
x = Bool -> Maybe a -> Tuple' Bool (Maybe a)
forall a b. a -> b -> Tuple' a b
Tuple' Bool
True (a -> Maybe a
forall a. a -> Maybe a
Just a
x)
extract :: Tuple' a b -> b
extract (Tuple' a
_ b
x) = b
x
{-# INLINE rollingMapM #-}
rollingMapM :: Monad m => (Maybe a -> a -> m b) -> Scanl m a b
rollingMapM :: forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> m b) -> Scanl m a b
rollingMapM Maybe a -> a -> m b
f = ((Maybe a, b) -> a -> m (Step (Maybe a, b) b))
-> m (Step (Maybe a, b) b)
-> ((Maybe a, b) -> m b)
-> ((Maybe a, b) -> m b)
-> Scanl m a b
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl (Maybe a, b) -> a -> m (Step (Maybe a, b) b)
forall {b} {b}. (Maybe a, b) -> a -> m (Step (Maybe a, b) b)
step m (Step (Maybe a, b) b)
forall {a} {b} {b}. m (Step (Maybe a, b) b)
initial (Maybe a, b) -> m b
forall {a} {b}. (a, b) -> m b
extract (Maybe a, b) -> m b
forall {a} {b}. (a, b) -> m b
extract
where
initial :: m (Step (Maybe a, b) b)
initial = Step (Maybe a, b) b -> m (Step (Maybe a, b) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Maybe a, b) b -> m (Step (Maybe a, b) b))
-> Step (Maybe a, b) b -> m (Step (Maybe a, b) b)
forall a b. (a -> b) -> a -> b
$ (Maybe a, b) -> Step (Maybe a, b) b
forall s b. s -> Step s b
Partial (Maybe a
forall a. Maybe a
Nothing, [Char] -> b
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
Step (Maybe a, b) b -> m (Step (Maybe a, b) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Maybe a, b) b -> m (Step (Maybe a, b) b))
-> Step (Maybe a, b) b -> m (Step (Maybe a, b) b)
forall a b. (a -> b) -> a -> b
$ (Maybe a, b) -> Step (Maybe a, b) b
forall s b. s -> Step s b
Partial (a -> Maybe a
forall a. a -> Maybe a
Just a
cur, b
x)
extract :: (a, b) -> m b
extract = b -> m b
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> ((a, b) -> b) -> (a, b) -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, b) -> b
forall a b. (a, b) -> b
snd
{-# INLINE rollingMap #-}
rollingMap :: Monad m => (Maybe a -> a -> b) -> Scanl m a b
rollingMap :: forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> b) -> Scanl m a b
rollingMap Maybe a -> a -> b
f = (Maybe a -> a -> m b) -> Scanl m a b
forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> m b) -> Scanl m a b
rollingMapM (\Maybe a
x a
y -> b -> m b
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> b -> m b
forall a b. (a -> b) -> a -> b
$ Maybe a -> a -> b
f Maybe a
x a
y)
{-# INLINE uniqBy #-}
uniqBy :: Monad m => (a -> a -> Bool) -> Scanl m a (Maybe a)
uniqBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Bool) -> Scanl m a (Maybe a)
uniqBy a -> a -> Bool
eq = (Maybe a -> a -> Maybe a) -> Scanl m a (Maybe a)
forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> b) -> Scanl 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 -> a -> Maybe a
forall a. a -> Maybe a
Just a
curr
Just a
x -> if a
x a -> a -> Bool
`eq` a
curr then Maybe a
forall a. Maybe a
Nothing else a -> Maybe a
forall a. a -> Maybe a
Just a
curr
{-# INLINE uniq #-}
uniq :: (Monad m, Eq a) => Scanl m a (Maybe a)
uniq :: forall (m :: * -> *) a. (Monad m, Eq a) => Scanl m a (Maybe a)
uniq = (a -> a -> Bool) -> Scanl m a (Maybe a)
forall (m :: * -> *) a.
Monad m =>
(a -> a -> Bool) -> Scanl m a (Maybe a)
uniqBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE prune #-}
prune ::
(a -> Bool) -> Scanl m a (Maybe a)
prune :: forall a (m :: * -> *). (a -> Bool) -> Scanl m a (Maybe a)
prune = [Char] -> (a -> Bool) -> Scanl m a (Maybe a)
forall a. HasCallStack => [Char] -> a
error [Char]
"Not implemented yet!"
repeated ::
Scanl m a (Maybe a)
repeated :: forall (m :: * -> *) a. Scanl m a (Maybe a)
repeated = [Char] -> Scanl m a (Maybe a)
forall a. HasCallStack => [Char] -> a
error [Char]
"Not implemented yet!"
{-# INLINE drainMapM #-}
drainMapM :: Monad m => (a -> m b) -> Scanl m a ()
drainMapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> Scanl m a ()
drainMapM a -> m b
f = (a -> m b) -> Scanl m b () -> Scanl m a ()
forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Scanl m b r -> Scanl m a r
lmapM a -> m b
f Scanl m b ()
forall (m :: * -> *) a. Monad m => Scanl m a ()
drain
{-# INLINE the #-}
the :: (Monad m, Eq a) => Scanl m a (Maybe a)
the :: forall (m :: * -> *) a. (Monad m, Eq a) => Scanl m a (Maybe a)
the = (Maybe a -> a -> Step (Maybe a) (Maybe a))
-> Step (Maybe a) (Maybe a)
-> (Maybe a -> Maybe a)
-> Scanl m a (Maybe a)
forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Scanl m a b
mkScant Maybe a -> a -> Step (Maybe a) (Maybe a)
forall {a} {a}. Eq a => Maybe a -> a -> Step (Maybe a) (Maybe a)
step Step (Maybe a) (Maybe a)
forall {a} {b}. Step (Maybe a) b
initial Maybe a -> Maybe a
forall a. a -> a
id
where
initial :: Step (Maybe a) b
initial = Maybe a -> Step (Maybe a) b
forall s b. s -> Step s b
Partial Maybe a
forall a. Maybe a
Nothing
step :: Maybe a -> a -> Step (Maybe a) (Maybe a)
step Maybe a
Nothing a
x = Maybe a -> Step (Maybe a) (Maybe a)
forall s b. s -> Step s b
Partial (a -> Maybe a
forall a. a -> Maybe a
Just a
x)
step old :: Maybe a
old@(Just a
x0) a
x =
if a
x0 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
x
then Maybe a -> Step (Maybe a) (Maybe a)
forall s b. s -> Step s b
Partial Maybe a
old
else Maybe a -> Step (Maybe a) (Maybe a)
forall s b. b -> Step s b
Done Maybe a
forall a. Maybe a
Nothing
{-# INLINE sum #-}
sum :: (Monad m, Num a) => Scanl m a a
sum :: forall (m :: * -> *) a. (Monad m, Num a) => Scanl m a a
sum = Scanl m (Incr a) a -> Scanl m a a
forall (m :: * -> *) a b. Scanl m (Incr a) b -> Scanl m a b
Scanl.cumulativeScan Scanl m (Incr a) a
forall (m :: * -> *) a. (Monad m, Num a) => Scanl m (Incr a) a
Scanl.incrSum
{-# INLINE product #-}
product :: (Monad m, Num a, Eq a) => Scanl m a a
product :: forall (m :: * -> *) a. (Monad m, Num a, Eq a) => Scanl m a a
product = (a -> a -> Step a a) -> Step a a -> (a -> a) -> Scanl m a a
forall (m :: * -> *) s a b.
Monad m =>
(s -> a -> Step s b) -> Step s b -> (s -> b) -> Scanl m a b
mkScant a -> a -> Step a a
forall {s} {b}. (Eq s, Num s, Num b) => s -> s -> Step s b
step (a -> Step a a
forall s b. s -> Step s b
Partial a
1) a -> a
forall a. a -> a
id
where
step :: s -> s -> Step s b
step s
x s
a =
if s
a s -> s -> Bool
forall a. Eq a => a -> a -> Bool
== s
0
then b -> Step s b
forall s b. b -> Step s b
Done b
0
else s -> Step s b
forall s b. s -> Step s b
Partial (s -> Step s b) -> s -> Step s b
forall a b. (a -> b) -> a -> b
$ s
x s -> s -> s
forall a. Num a => a -> a -> a
* s
a
{-# INLINE mean #-}
mean :: (Monad m, Fractional a) => Scanl m a a
mean :: forall (m :: * -> *) a. (Monad m, Fractional a) => Scanl m a a
mean = (Tuple' a a -> a) -> Scanl m a (Tuple' a a) -> Scanl m a a
forall a b. (a -> b) -> Scanl m a a -> Scanl m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Tuple' a a -> a
forall {a} {b}. Tuple' a b -> a
done (Scanl m a (Tuple' a a) -> Scanl m a a)
-> Scanl m a (Tuple' a a) -> Scanl m a a
forall a b. (a -> b) -> a -> b
$ (Tuple' a a -> a -> Tuple' a a)
-> Tuple' a a -> Scanl m a (Tuple' a a)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
mkScanl Tuple' a a -> a -> Tuple' a a
forall {b}. Fractional b => Tuple' b b -> b -> Tuple' b b
step Tuple' a a
begin
where
begin :: Tuple' a a
begin = a -> a -> Tuple' a a
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 b -> b -> b
forall a. Num a => a -> a -> a
+ b
1
in b -> b -> Tuple' b b
forall a b. a -> b -> Tuple' a b
Tuple' (b
x b -> b -> b
forall a. Num a => a -> a -> a
+ (b
y b -> b -> b
forall a. Num a => a -> a -> a
- b
x) b -> b -> b
forall a. Fractional a => a -> a -> a
/ b
n1) b
n1
done :: Tuple' a b -> a
done (Tuple' a
x b
_) = a
x
{-# INLINE rollingHashWithSalt #-}
rollingHashWithSalt :: (Monad m, Enum a) => Int64 -> Scanl m a Int64
rollingHashWithSalt :: forall (m :: * -> *) a.
(Monad m, Enum a) =>
Int64 -> Scanl m a Int64
rollingHashWithSalt = (Int64 -> a -> Int64) -> Int64 -> Scanl m a Int64
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
mkScanl Int64 -> a -> Int64
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 Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
* Int64
k Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+ Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a -> Int
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) => Scanl m a Int64
rollingHash :: forall (m :: * -> *) a. (Monad m, Enum a) => Scanl m a Int64
rollingHash = Int64 -> Scanl m a Int64
forall (m :: * -> *) a.
(Monad m, Enum a) =>
Int64 -> Scanl m a Int64
rollingHashWithSalt Int64
defaultSalt
{-# INLINE rollingHashFirstN #-}
rollingHashFirstN :: (Monad m, Enum a) => Int -> Scanl m a Int64
rollingHashFirstN :: forall (m :: * -> *) a. (Monad m, Enum a) => Int -> Scanl m a Int64
rollingHashFirstN Int
n = Int -> Scanl m a Int64 -> Scanl m a Int64
forall (m :: * -> *) a b.
Monad m =>
Int -> Scanl m a b -> Scanl m a b
take Int
n Scanl m a Int64
forall (m :: * -> *) a. (Monad m, Enum a) => Scanl m a Int64
rollingHash
{-# INLINE sconcat #-}
sconcat :: (Monad m, Semigroup a) => a -> Scanl m a a
sconcat :: forall (m :: * -> *) a. (Monad m, Semigroup a) => a -> Scanl m a a
sconcat = (a -> a -> a) -> a -> Scanl m a a
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
mkScanl a -> a -> a
forall a. Semigroup a => a -> a -> a
(<>)
{-# INLINE mconcat #-}
mconcat ::
( Monad m
, Monoid a) => Scanl m a a
mconcat :: forall (m :: * -> *) a. (Monad m, Monoid a) => Scanl m a a
mconcat = a -> Scanl m a a
forall (m :: * -> *) a. (Monad m, Semigroup a) => a -> Scanl m a a
sconcat a
forall a. Monoid a => a
mempty
{-# INLINE foldMap #-}
foldMap :: (Monad m, Monoid b) => (a -> b) -> Scanl m a b
foldMap :: forall (m :: * -> *) b a.
(Monad m, Monoid b) =>
(a -> b) -> Scanl m a b
foldMap a -> b
f = (a -> b) -> Scanl m b b -> Scanl m a b
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
lmap a -> b
f Scanl m b b
forall (m :: * -> *) a. (Monad m, Monoid a) => Scanl m a a
mconcat
{-# INLINE foldMapM #-}
foldMapM :: (Monad m, Monoid b) => (a -> m b) -> Scanl m a b
foldMapM :: forall (m :: * -> *) b a.
(Monad m, Monoid b) =>
(a -> m b) -> Scanl m a b
foldMapM a -> m b
act = (b -> a -> m b) -> m b -> Scanl m a b
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> m b) -> m b -> Scanl m a b
mkScanlM b -> a -> m b
step (b -> m b
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure b
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
b -> m b
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> b -> m b
forall a b. (a -> b) -> a -> b
$! b -> b -> b
forall a. Monoid a => a -> a -> a
mappend b
m b
m'
{-# INLINE toListRev #-}
toListRev :: Monad m => Scanl m a [a]
toListRev :: forall (m :: * -> *) a. Monad m => Scanl m a [a]
toListRev = ([a] -> a -> [a]) -> [a] -> Scanl m a [a]
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
mkScanl ((a -> [a] -> [a]) -> [a] -> a -> [a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (:)) []
{-# INLINE drainN #-}
drainN :: Monad m => Int -> Scanl m a ()
drainN :: forall (m :: * -> *) a. Monad m => Int -> Scanl m a ()
drainN Int
n = Int -> Scanl m a () -> Scanl m a ()
forall (m :: * -> *) a b.
Monad m =>
Int -> Scanl m a b -> Scanl m a b
take Int
n Scanl m a ()
forall (m :: * -> *) a. Monad m => Scanl m a ()
drain
{-# INLINE findIndices #-}
findIndices :: Monad m => (a -> Bool) -> Scanl m a (Maybe Int)
findIndices :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Scanl m a (Maybe Int)
findIndices a -> Bool
predicate =
(Either Int Int -> Maybe Int)
-> Scanl m a (Either Int Int) -> Scanl m a (Maybe Int)
forall a b. (a -> b) -> Scanl m a a -> Scanl m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> Maybe Int)
-> (Int -> Maybe Int) -> Either Int Int -> Maybe Int
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe Int -> Int -> Maybe Int
forall a b. a -> b -> a
Prelude.const Maybe Int
forall a. Maybe a
Nothing) Int -> Maybe Int
forall a. a -> Maybe a
Just) (Scanl m a (Either Int Int) -> Scanl m a (Maybe Int))
-> Scanl m a (Either Int Int) -> Scanl m a (Maybe Int)
forall a b. (a -> b) -> a -> b
$ (Either Int Int -> a -> Either Int Int)
-> Either Int Int -> Scanl m a (Either Int Int)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
mkScanl Either Int Int -> a -> Either Int Int
forall {a}. Num a => Either a a -> a -> Either a a
step (Int -> Either Int Int
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 a -> Either a a
forall a b. b -> Either a b
Right ((a -> a) -> (a -> a) -> Either a a -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either a -> a
forall a. a -> a
id a -> a
forall a. a -> a
id Either a a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
else a -> Either a a
forall a b. a -> Either a b
Left ((a -> a) -> (a -> a) -> Either a a -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either a -> a
forall a. a -> a
id a -> a
forall a. a -> a
id Either a a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
{-# INLINE elemIndices #-}
elemIndices :: (Monad m, Eq a) => a -> Scanl m a (Maybe Int)
elemIndices :: forall (m :: * -> *) a.
(Monad m, Eq a) =>
a -> Scanl m a (Maybe Int)
elemIndices a
a = (a -> Bool) -> Scanl m a (Maybe Int)
forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Scanl m a (Maybe Int)
findIndices (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
a)
{-# INLINE takingEndByM #-}
takingEndByM :: Monad m => (a -> m Bool) -> Scanl m a (Maybe a)
takingEndByM :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Scanl m a (Maybe a)
takingEndByM a -> m Bool
p = (Maybe' a -> a -> m (Step (Maybe' a) (Maybe a)))
-> m (Step (Maybe' a) (Maybe a))
-> (Maybe' a -> m (Maybe a))
-> (Maybe' a -> m (Maybe a))
-> Scanl m a (Maybe a)
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl Maybe' a -> a -> m (Step (Maybe' a) (Maybe a))
forall {p}. p -> a -> m (Step (Maybe' a) (Maybe a))
step m (Step (Maybe' a) (Maybe a))
forall {a} {b}. m (Step (Maybe' a) b)
initial Maybe' a -> m (Maybe a)
forall {a}. Maybe' a -> m (Maybe a)
extract Maybe' a -> m (Maybe a)
forall {a}. Maybe' a -> m (Maybe a)
extract
where
initial :: m (Step (Maybe' a) b)
initial = Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Maybe' a) b -> m (Step (Maybe' a) b))
-> Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a b. (a -> b) -> a -> b
$ Maybe' a -> Step (Maybe' a) b
forall s b. s -> Step s b
Partial Maybe' a
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
Step (Maybe' a) (Maybe a) -> m (Step (Maybe' a) (Maybe a))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Maybe' a) (Maybe a) -> m (Step (Maybe' a) (Maybe a)))
-> Step (Maybe' a) (Maybe a) -> m (Step (Maybe' a) (Maybe a))
forall a b. (a -> b) -> a -> b
$ if Bool
r
then Maybe a -> Step (Maybe' a) (Maybe a)
forall s b. b -> Step s b
Done (Maybe a -> Step (Maybe' a) (Maybe a))
-> Maybe a -> Step (Maybe' a) (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
a
else Maybe' a -> Step (Maybe' a) (Maybe a)
forall s b. s -> Step s b
Partial (Maybe' a -> Step (Maybe' a) (Maybe a))
-> Maybe' a -> Step (Maybe' a) (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe' a
forall a. a -> Maybe' a
Just' a
a
extract :: Maybe' a -> m (Maybe a)
extract = Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe a -> m (Maybe a))
-> (Maybe' a -> Maybe a) -> Maybe' a -> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe' a -> Maybe a
forall a. Maybe' a -> Maybe a
toMaybe
{-# INLINE takingEndBy #-}
takingEndBy :: Monad m => (a -> Bool) -> Scanl m a (Maybe a)
takingEndBy :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Scanl m a (Maybe a)
takingEndBy a -> Bool
p = (a -> m Bool) -> Scanl m a (Maybe a)
forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Scanl m a (Maybe a)
takingEndByM (Bool -> m Bool
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> m Bool) -> (a -> Bool) -> a -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# INLINE takingEndByM_ #-}
takingEndByM_ :: Monad m => (a -> m Bool) -> Scanl m a (Maybe a)
takingEndByM_ :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Scanl m a (Maybe a)
takingEndByM_ a -> m Bool
p = (Maybe' a -> a -> m (Step (Maybe' a) (Maybe a)))
-> m (Step (Maybe' a) (Maybe a))
-> (Maybe' a -> m (Maybe a))
-> (Maybe' a -> m (Maybe a))
-> Scanl m a (Maybe a)
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl Maybe' a -> a -> m (Step (Maybe' a) (Maybe a))
forall {p} {a}. p -> a -> m (Step (Maybe' a) (Maybe a))
step m (Step (Maybe' a) (Maybe a))
forall {a} {b}. m (Step (Maybe' a) b)
initial Maybe' a -> m (Maybe a)
forall {a}. Maybe' a -> m (Maybe a)
extract Maybe' a -> m (Maybe a)
forall {a}. Maybe' a -> m (Maybe a)
extract
where
initial :: m (Step (Maybe' a) b)
initial = Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Maybe' a) b -> m (Step (Maybe' a) b))
-> Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a b. (a -> b) -> a -> b
$ Maybe' a -> Step (Maybe' a) b
forall s b. s -> Step s b
Partial Maybe' a
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
Step (Maybe' a) (Maybe a) -> m (Step (Maybe' a) (Maybe a))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Maybe' a) (Maybe a) -> m (Step (Maybe' a) (Maybe a)))
-> Step (Maybe' a) (Maybe a) -> m (Step (Maybe' a) (Maybe a))
forall a b. (a -> b) -> a -> b
$ if Bool
r
then Maybe a -> Step (Maybe' a) (Maybe a)
forall s b. b -> Step s b
Done Maybe a
forall a. Maybe a
Nothing
else Maybe' a -> Step (Maybe' a) (Maybe a)
forall s b. s -> Step s b
Partial (Maybe' a -> Step (Maybe' a) (Maybe a))
-> Maybe' a -> Step (Maybe' a) (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe' a
forall a. a -> Maybe' a
Just' a
a
extract :: Maybe' a -> m (Maybe a)
extract = Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe a -> m (Maybe a))
-> (Maybe' a -> Maybe a) -> Maybe' a -> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe' a -> Maybe a
forall a. Maybe' a -> Maybe a
toMaybe
{-# INLINE takingEndBy_ #-}
takingEndBy_ :: Monad m => (a -> Bool) -> Scanl m a (Maybe a)
takingEndBy_ :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Scanl m a (Maybe a)
takingEndBy_ a -> Bool
p = (a -> m Bool) -> Scanl m a (Maybe a)
forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Scanl m a (Maybe a)
takingEndByM_ (Bool -> m Bool
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> m Bool) -> (a -> Bool) -> a -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# INLINE droppingWhileM #-}
droppingWhileM :: Monad m => (a -> m Bool) -> Scanl m a (Maybe a)
droppingWhileM :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Scanl m a (Maybe a)
droppingWhileM a -> m Bool
p = (Maybe' a -> a -> m (Step (Maybe' a) (Maybe a)))
-> m (Step (Maybe' a) (Maybe a))
-> (Maybe' a -> m (Maybe a))
-> (Maybe' a -> m (Maybe a))
-> Scanl m a (Maybe a)
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl Maybe' a -> a -> m (Step (Maybe' a) (Maybe a))
forall {a} {b}. Maybe' a -> a -> m (Step (Maybe' a) b)
step m (Step (Maybe' a) (Maybe a))
forall {a} {b}. m (Step (Maybe' a) b)
initial Maybe' a -> m (Maybe a)
forall {a}. Maybe' a -> m (Maybe a)
extract Maybe' a -> m (Maybe a)
forall {a}. Maybe' a -> m (Maybe a)
extract
where
initial :: m (Step (Maybe' a) b)
initial = Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Maybe' a) b -> m (Step (Maybe' a) b))
-> Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a b. (a -> b) -> a -> b
$ Maybe' a -> Step (Maybe' a) b
forall s b. s -> Step s b
Partial Maybe' a
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
Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Maybe' a) b -> m (Step (Maybe' a) b))
-> Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a b. (a -> b) -> a -> b
$ Maybe' a -> Step (Maybe' a) b
forall s b. s -> Step s b
Partial
(Maybe' a -> Step (Maybe' a) b) -> Maybe' a -> Step (Maybe' a) b
forall a b. (a -> b) -> a -> b
$ if Bool
r
then Maybe' a
forall a. Maybe' a
Nothing'
else a -> Maybe' a
forall a. a -> Maybe' a
Just' a
a
step Maybe' a
_ a
a = Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Maybe' a) b -> m (Step (Maybe' a) b))
-> Step (Maybe' a) b -> m (Step (Maybe' a) b)
forall a b. (a -> b) -> a -> b
$ Maybe' a -> Step (Maybe' a) b
forall s b. s -> Step s b
Partial (Maybe' a -> Step (Maybe' a) b) -> Maybe' a -> Step (Maybe' a) b
forall a b. (a -> b) -> a -> b
$ a -> Maybe' a
forall a. a -> Maybe' a
Just' a
a
extract :: Maybe' a -> m (Maybe a)
extract = Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe a -> m (Maybe a))
-> (Maybe' a -> Maybe a) -> Maybe' a -> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe' a -> Maybe a
forall a. Maybe' a -> Maybe a
toMaybe
{-# INLINE droppingWhile #-}
droppingWhile :: Monad m => (a -> Bool) -> Scanl m a (Maybe a)
droppingWhile :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Scanl m a (Maybe a)
droppingWhile a -> Bool
p = (a -> m Bool) -> Scanl m a (Maybe a)
forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Scanl m a (Maybe a)
droppingWhileM (Bool -> m Bool
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> m Bool) -> (a -> Bool) -> a -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# INLINE tee #-}
tee :: Monad m => Scanl m a b -> Scanl m a c -> Scanl m a (b,c)
tee :: forall (m :: * -> *) a b c.
Monad m =>
Scanl m a b -> Scanl m a c -> Scanl m a (b, c)
tee = (b -> c -> (b, c))
-> Scanl m a b -> Scanl m a c -> Scanl m a (b, c)
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
teeWith (,)
{-# INLINE distribute #-}
distribute :: Monad m => [Scanl m a b] -> Scanl m a [b]
distribute :: forall (m :: * -> *) a b. Monad m => [Scanl m a b] -> Scanl m a [b]
distribute = (Scanl m a b -> Scanl m a [b] -> Scanl m a [b])
-> Scanl m a [b] -> [Scanl m a b] -> Scanl m a [b]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
Prelude.foldr ((b -> [b] -> [b]) -> Scanl m a b -> Scanl m a [b] -> Scanl m a [b]
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
teeWith (:)) ([b] -> Scanl m a [b]
forall (m :: * -> *) b a. Applicative m => b -> Scanl m a b
const [])
data PartState sL sR = PartLeft !sL !sR | PartRight !sL !sR
{-# INLINE partitionByM #-}
partitionByM :: Monad m
=> (a -> m (Either b c)) -> Scanl m b x -> Scanl m c x -> Scanl m a x
partitionByM :: forall (m :: * -> *) a b c x.
Monad m =>
(a -> m (Either b c)) -> Scanl m b x -> Scanl m c x -> Scanl m a x
partitionByM a -> m (Either b c)
f
(Scanl s -> b -> m (Step s x)
stepL m (Step s x)
initialL s -> m x
extractL s -> m x
finalL)
(Scanl s -> c -> m (Step s x)
stepR m (Step s x)
initialR s -> m x
extractR s -> m x
finalR) =
(PartState s s -> a -> m (Step (PartState s s) x))
-> m (Step (PartState s s) x)
-> (PartState s s -> m x)
-> (PartState s s -> m x)
-> Scanl m a x
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl PartState s s -> a -> m (Step (PartState s s) x)
step m (Step (PartState s s) x)
initial PartState s s -> m x
extract PartState s s -> m x
final
where
initial :: m (Step (PartState s s) x)
initial = do
Step s x
resL <- m (Step s x)
initialL
Step s x
resR <- m (Step s x)
initialR
Step (PartState s s) x -> m (Step (PartState s s) x)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (PartState s s) x -> m (Step (PartState s s) x))
-> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a b. (a -> b) -> a -> b
$ case Step s x
resL of
Done x
bl -> x -> Step (PartState s s) x
forall s b. b -> Step s b
Done x
bl
Partial s
sl ->
case Step s x
resR of
Partial s
sr -> PartState s s -> Step (PartState s s) x
forall s b. s -> Step s b
Partial (PartState s s -> Step (PartState s s) x)
-> PartState s s -> Step (PartState s s) x
forall a b. (a -> b) -> a -> b
$ s -> s -> PartState s s
forall sL sR. sL -> sR -> PartState sL sR
PartLeft s
sl s
sr
Done x
br -> x -> Step (PartState s s) x
forall s b. b -> Step s b
Done x
br
runBoth :: s -> s -> a -> m (Step (PartState s s) x)
runBoth s
sL s
sR a
a = do
Either b c
pRes <- a -> m (Either b c)
f a
a
case Either b c
pRes of
Left b
b -> do
Step s x
resL <- s -> b -> m (Step s x)
stepL s
sL b
b
case Step s x
resL of
Partial s
s -> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (PartState s s) x -> m (Step (PartState s s) x))
-> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a b. (a -> b) -> a -> b
$ PartState s s -> Step (PartState s s) x
forall s b. s -> Step s b
Partial (PartState s s -> Step (PartState s s) x)
-> PartState s s -> Step (PartState s s) x
forall a b. (a -> b) -> a -> b
$ s -> s -> PartState s s
forall sL sR. sL -> sR -> PartState sL sR
PartLeft s
s s
sR
Done x
x -> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (PartState s s) x -> m (Step (PartState s s) x))
-> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a b. (a -> b) -> a -> b
$ x -> Step (PartState s s) x
forall s b. b -> Step s b
Done x
x
Right c
c -> do
Step s x
resR <- s -> c -> m (Step s x)
stepR s
sR c
c
case Step s x
resR of
Partial s
s -> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (PartState s s) x -> m (Step (PartState s s) x))
-> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a b. (a -> b) -> a -> b
$ PartState s s -> Step (PartState s s) x
forall s b. s -> Step s b
Partial (PartState s s -> Step (PartState s s) x)
-> PartState s s -> Step (PartState s s) x
forall a b. (a -> b) -> a -> b
$ s -> s -> PartState s s
forall sL sR. sL -> sR -> PartState sL sR
PartRight s
sL s
s
Done x
x -> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (PartState s s) x -> m (Step (PartState s s) x))
-> Step (PartState s s) x -> m (Step (PartState s s) x)
forall a b. (a -> b) -> a -> b
$ x -> Step (PartState s s) x
forall s b. b -> Step s b
Done x
x
step :: PartState s s -> a -> m (Step (PartState s s) x)
step (PartLeft s
sL s
sR) = s -> s -> a -> m (Step (PartState s s) x)
runBoth s
sL s
sR
step (PartRight s
sL s
sR) = s -> s -> a -> m (Step (PartState s s) x)
runBoth s
sL s
sR
extract :: PartState s s -> m x
extract (PartLeft s
sL s
_) = s -> m x
extractL s
sL
extract (PartRight s
_ s
sR) = s -> m x
extractR s
sR
final :: PartState s s -> m x
final (PartLeft s
sL s
sR) = s -> m x
finalR s
sR m x -> m x -> m x
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> s -> m x
finalL s
sL
final (PartRight s
sL s
sR) = s -> m x
finalL s
sL m x -> m x -> m x
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> s -> m x
finalR s
sR
{-# INLINE partitionBy #-}
partitionBy :: Monad m
=> (a -> Either b c) -> Scanl m b x -> Scanl m c x -> Scanl m a x
partitionBy :: forall (m :: * -> *) a b c x.
Monad m =>
(a -> Either b c) -> Scanl m b x -> Scanl m c x -> Scanl m a x
partitionBy a -> Either b c
f = (a -> m (Either b c)) -> Scanl m b x -> Scanl m c x -> Scanl m a x
forall (m :: * -> *) a b c x.
Monad m =>
(a -> m (Either b c)) -> Scanl m b x -> Scanl m c x -> Scanl m a x
partitionByM (Either b c -> m (Either b c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either b c -> m (Either b c))
-> (a -> Either b c) -> a -> m (Either b c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either b c
f)
{-# INLINE partition #-}
partition :: Monad m
=> Scanl m b x -> Scanl m c x -> Scanl m (Either b c) x
partition :: forall (m :: * -> *) b x c.
Monad m =>
Scanl m b x -> Scanl m c x -> Scanl m (Either b c) x
partition = (Either b c -> Either b c)
-> Scanl m b x -> Scanl m c x -> Scanl m (Either b c) x
forall (m :: * -> *) a b c x.
Monad m =>
(a -> Either b c) -> Scanl m b x -> Scanl m c x -> Scanl m a x
partitionBy Either b c -> Either b c
forall a. a -> a
id
{-# INLINE unzipWithMUsing #-}
unzipWithMUsing :: Monad m =>
( (x -> y -> (x, y))
-> Scanl m (b, c) x
-> Scanl m (b, c) y
-> Scanl m (b, c) (x, y)
)
-> (a -> m (b, c))
-> Scanl m b x
-> Scanl m c y
-> Scanl m a (x, y)
unzipWithMUsing :: forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Scanl m (b, c) x -> Scanl m (b, c) y -> Scanl m (b, c) (x, y))
-> (a -> m (b, c))
-> Scanl m b x
-> Scanl m c y
-> Scanl m a (x, y)
unzipWithMUsing (x -> y -> (x, y))
-> Scanl m (b, c) x -> Scanl m (b, c) y -> Scanl m (b, c) (x, y)
t a -> m (b, c)
f Scanl m b x
fld1 Scanl m c y
fld2 =
let f1 :: Scanl m (b, b) x
f1 = ((b, b) -> b) -> Scanl m b x -> Scanl m (b, b) x
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
lmap (b, b) -> b
forall a b. (a, b) -> a
fst Scanl m b x
fld1
f2 :: Scanl m (a, c) y
f2 = ((a, c) -> c) -> Scanl m c y -> Scanl m (a, c) y
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
lmap (a, c) -> c
forall a b. (a, b) -> b
snd Scanl m c y
fld2
in (a -> m (b, c)) -> Scanl m (b, c) (x, y) -> Scanl m a (x, y)
forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> Scanl m b r -> Scanl m a r
lmapM a -> m (b, c)
f ((x -> y -> (x, y))
-> Scanl m (b, c) x -> Scanl m (b, c) y -> Scanl m (b, c) (x, y)
t (,) Scanl m (b, c) x
forall {b}. Scanl m (b, b) x
f1 Scanl m (b, c) y
forall {a}. Scanl m (a, c) y
f2)
{-# INLINE unzipWithM #-}
unzipWithM :: Monad m
=> (a -> m (b,c)) -> Scanl m b x -> Scanl m c y -> Scanl m a (x,y)
unzipWithM :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (b, c)) -> Scanl m b x -> Scanl m c y -> Scanl m a (x, y)
unzipWithM = ((x -> y -> (x, y))
-> Scanl m (b, c) x -> Scanl m (b, c) y -> Scanl m (b, c) (x, y))
-> (a -> m (b, c))
-> Scanl m b x
-> Scanl m c y
-> Scanl m a (x, y)
forall (m :: * -> *) x y b c a.
Monad m =>
((x -> y -> (x, y))
-> Scanl m (b, c) x -> Scanl m (b, c) y -> Scanl m (b, c) (x, y))
-> (a -> m (b, c))
-> Scanl m b x
-> Scanl m c y
-> Scanl m a (x, y)
unzipWithMUsing (x -> y -> (x, y))
-> Scanl m (b, c) x -> Scanl m (b, c) y -> Scanl m (b, c) (x, y)
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
teeWith
{-# INLINE unzipWith #-}
unzipWith :: Monad m
=> (a -> (b,c)) -> Scanl m b x -> Scanl m c y -> Scanl m a (x,y)
unzipWith :: forall (m :: * -> *) a b c x y.
Monad m =>
(a -> (b, c)) -> Scanl m b x -> Scanl m c y -> Scanl m a (x, y)
unzipWith a -> (b, c)
f = (a -> m (b, c)) -> Scanl m b x -> Scanl m c y -> Scanl m a (x, y)
forall (m :: * -> *) a b c x y.
Monad m =>
(a -> m (b, c)) -> Scanl m b x -> Scanl m c y -> Scanl m a (x, y)
unzipWithM ((b, c) -> m (b, c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ((b, c) -> m (b, c)) -> (a -> (b, c)) -> a -> m (b, c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, c)
f)
{-# INLINE unzip #-}
unzip :: Monad m => Scanl m a x -> Scanl m b y -> Scanl m (a,b) (x,y)
unzip :: forall (m :: * -> *) a x b y.
Monad m =>
Scanl m a x -> Scanl m b y -> Scanl m (a, b) (x, y)
unzip = ((a, b) -> (a, b))
-> Scanl m a x -> Scanl m b y -> Scanl m (a, b) (x, y)
forall (m :: * -> *) a b c x y.
Monad m =>
(a -> (b, c)) -> Scanl m b x -> Scanl m c y -> Scanl m a (x, y)
unzipWith (a, b) -> (a, b)
forall a. a -> a
id
{-# INLINE zipStreamWithM #-}
zipStreamWithM ::
(a -> b -> m c) -> Stream m a -> Scanl m c x -> Scanl m b x
zipStreamWithM :: forall a b (m :: * -> *) c x.
(a -> b -> m c) -> Stream m a -> Scanl m c x -> Scanl m b x
zipStreamWithM = (a -> b -> m c) -> Stream m a -> Scanl m c x -> Scanl m b x
forall a. HasCallStack => a
undefined
{-# INLINE zipStream #-}
zipStream :: Monad m => Stream m a -> Scanl m (a, b) x -> Scanl m b x
zipStream :: forall (m :: * -> *) a b x.
Monad m =>
Stream m a -> Scanl m (a, b) x -> Scanl m b x
zipStream = (a -> b -> m (a, b))
-> Stream m a -> Scanl m (a, b) x -> Scanl m b x
forall a b (m :: * -> *) c x.
(a -> b -> m c) -> Stream m a -> Scanl m c x -> Scanl m b x
zipStreamWithM (((a, b) -> m (a, b)) -> a -> b -> m (a, b)
forall a b c. ((a, b) -> c) -> a -> b -> c
curry (a, b) -> m (a, b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return)
{-# INLINE indexingWith #-}
indexingWith :: Monad m => Int -> (Int -> Int) -> Scanl m a (Maybe (Int, a))
indexingWith :: forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Int) -> Scanl m a (Maybe (Int, a))
indexingWith Int
i Int -> Int
f = (Maybe' (Int, a) -> Maybe (Int, a))
-> Scanl m a (Maybe' (Int, a)) -> Scanl m a (Maybe (Int, a))
forall a b. (a -> b) -> Scanl m a a -> Scanl m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe' (Int, a) -> Maybe (Int, a)
forall a. Maybe' a -> Maybe a
toMaybe (Scanl m a (Maybe' (Int, a)) -> Scanl m a (Maybe (Int, a)))
-> Scanl m a (Maybe' (Int, a)) -> Scanl m a (Maybe (Int, a))
forall a b. (a -> b) -> a -> b
$ (Maybe' (Int, a) -> a -> Maybe' (Int, a))
-> Maybe' (Int, a) -> Scanl m a (Maybe' (Int, a))
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
mkScanl Maybe' (Int, a) -> a -> Maybe' (Int, a)
forall {b} {b}. Maybe' (Int, b) -> b -> Maybe' (Int, b)
step Maybe' (Int, a)
forall a. Maybe' a
initial
where
initial :: Maybe' a
initial = Maybe' a
forall a. Maybe' a
Nothing'
step :: Maybe' (Int, b) -> b -> Maybe' (Int, b)
step Maybe' (Int, b)
Nothing' b
a = (Int, b) -> Maybe' (Int, b)
forall a. a -> Maybe' a
Just' (Int
i, b
a)
step (Just' (Int
n, b
_)) b
a = (Int, b) -> Maybe' (Int, b)
forall a. a -> Maybe' a
Just' (Int -> Int
f Int
n, b
a)
{-# INLINE indexing #-}
indexing :: Monad m => Scanl m a (Maybe (Int, a))
indexing :: forall (m :: * -> *) a. Monad m => Scanl m a (Maybe (Int, a))
indexing = Int -> (Int -> Int) -> Scanl m a (Maybe (Int, a))
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Int) -> Scanl m a (Maybe (Int, a))
indexingWith Int
0 (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
{-# INLINE indexingRev #-}
indexingRev :: Monad m => Int -> Scanl m a (Maybe (Int, a))
indexingRev :: forall (m :: * -> *) a.
Monad m =>
Int -> Scanl m a (Maybe (Int, a))
indexingRev Int
n = Int -> (Int -> Int) -> Scanl m a (Maybe (Int, a))
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Int) -> Scanl m a (Maybe (Int, a))
indexingWith Int
n (Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract Int
1)
{-# INLINE indexed #-}
indexed :: Monad m => Scanl m (Int, a) b -> Scanl m a b
indexed :: forall (m :: * -> *) a b.
Monad m =>
Scanl m (Int, a) b -> Scanl m a b
indexed = Scanl m a (Maybe (Int, a)) -> Scanl m (Int, a) b -> Scanl m a b
forall (m :: * -> *) a b c.
Monad m =>
Scanl m a (Maybe b) -> Scanl m b c -> Scanl m a c
postscanlMaybe Scanl m a (Maybe (Int, a))
forall (m :: * -> *) a. Monad m => Scanl m a (Maybe (Int, a))
indexing
{-# INLINE with #-}
with ::
(Scanl m (s, a) b -> Scanl m a b)
-> (((s, a) -> c) -> Scanl m (s, a) b -> Scanl m (s, a) b)
-> (((s, a) -> c) -> Scanl m a b -> Scanl m a b)
with :: forall (m :: * -> *) s a b c.
(Scanl m (s, a) b -> Scanl m a b)
-> (((s, a) -> c) -> Scanl m (s, a) b -> Scanl m (s, a) b)
-> ((s, a) -> c)
-> Scanl m a b
-> Scanl m a b
with Scanl m (s, a) b -> Scanl m a b
f ((s, a) -> c) -> Scanl m (s, a) b -> Scanl m (s, a) b
comb (s, a) -> c
g = Scanl m (s, a) b -> Scanl m a b
f (Scanl m (s, a) b -> Scanl m a b)
-> (Scanl m a b -> Scanl m (s, a) b) -> Scanl m a b -> Scanl m a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((s, a) -> c) -> Scanl m (s, a) b -> Scanl m (s, a) b
comb (s, a) -> c
g (Scanl m (s, a) b -> Scanl m (s, a) b)
-> (Scanl m a b -> Scanl m (s, a) b)
-> Scanl m a b
-> Scanl m (s, a) b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((s, a) -> a) -> Scanl m a b -> Scanl m (s, a) b
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
lmap (s, a) -> a
forall a b. (a, b) -> b
snd
{-# INLINE sampleFromthen #-}
sampleFromthen :: Monad m => Int -> Int -> Scanl m a b -> Scanl m a b
sampleFromthen :: forall (m :: * -> *) a b.
Monad m =>
Int -> Int -> Scanl m a b -> Scanl m a b
sampleFromthen Int
offset Int
size =
(Scanl m (Int, a) b -> Scanl m a b)
-> (((Int, a) -> Bool) -> Scanl m (Int, a) b -> Scanl m (Int, a) b)
-> ((Int, a) -> Bool)
-> Scanl m a b
-> Scanl m a b
forall (m :: * -> *) s a b c.
(Scanl m (s, a) b -> Scanl m a b)
-> (((s, a) -> c) -> Scanl m (s, a) b -> Scanl m (s, a) b)
-> ((s, a) -> c)
-> Scanl m a b
-> Scanl m a b
with Scanl m (Int, a) b -> Scanl m a b
forall (m :: * -> *) a b.
Monad m =>
Scanl m (Int, a) b -> Scanl m a b
indexed ((Int, a) -> Bool) -> Scanl m (Int, a) b -> Scanl m (Int, a) b
forall (m :: * -> *) a r.
Monad m =>
(a -> Bool) -> Scanl m a r -> Scanl m a r
filter (\(Int
i, a
_) -> (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
offset) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
size Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0)
{-# INLINE toStream #-}
toStream :: (Monad m, Monad n) => Scanl m a (Stream n a)
toStream :: forall (m :: * -> *) (n :: * -> *) a.
(Monad m, Monad n) =>
Scanl m a (Stream n a)
toStream = ([a] -> Stream n a) -> Scanl m a [a] -> Scanl m a (Stream n a)
forall a b. (a -> b) -> Scanl m a a -> Scanl m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Stream n a
forall (m :: * -> *) a. Applicative m => [a] -> Stream m a
StreamD.fromList Scanl m a [a]
forall (m :: * -> *) a. Monad m => Scanl m a [a]
toList
{-# INLINE toStreamRev #-}
toStreamRev :: (Monad m, Monad n) => Scanl m a (Stream n a)
toStreamRev :: forall (m :: * -> *) (n :: * -> *) a.
(Monad m, Monad n) =>
Scanl m a (Stream n a)
toStreamRev = ([a] -> Stream n a) -> Scanl m a [a] -> Scanl m a (Stream n a)
forall a b. (a -> b) -> Scanl m a a -> Scanl m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Stream n a
forall (m :: * -> *) a. Applicative m => [a] -> Stream m a
StreamD.fromList Scanl m a [a]
forall (m :: * -> *) a. Monad m => Scanl m a [a]
toListRev
{-# INLINE unfoldMany #-}
unfoldMany :: Monad m => Unfold m a b -> Scanl m b c -> Scanl m a c
unfoldMany :: forall (m :: * -> *) a b c.
Monad m =>
Unfold m a b -> Scanl m b c -> Scanl m a c
unfoldMany (Unfold s -> m (Step s b)
ustep a -> m s
inject) (Scanl s -> b -> m (Step s c)
fstep m (Step s c)
initial s -> m c
extract s -> m c
final) =
(s -> a -> m (Step s c))
-> m (Step s c) -> (s -> m c) -> (s -> m c) -> Scanl m a c
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl s -> a -> m (Step s c)
consume m (Step s c)
initial s -> m c
extract s -> m c
final
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 -> Step s c -> m (Step s c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step s c -> m (Step s c)) -> Step s c -> m (Step s c)
forall a b. (a -> b) -> a -> b
$ c -> Step s c
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 -> Step s c -> m (Step s c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step s c -> m (Step s c)) -> Step s c -> m (Step s c)
forall a b. (a -> b) -> a -> b
$ s -> Step s c
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 m s -> (s -> m (Step s c)) -> m (Step s c)
forall a b. m a -> (a -> m b) -> m b
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
-> Scanl m a (MutArray a)
bottomBy :: forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
bottomBy a -> a -> Ordering
cmp Int
n = ((MutArray a, Int) -> a -> m (Step (MutArray a, Int) (MutArray a)))
-> m (Step (MutArray a, Int) (MutArray a))
-> ((MutArray a, Int) -> m (MutArray a))
-> ((MutArray a, Int) -> m (MutArray a))
-> Scanl m a (MutArray a)
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl (MutArray a, Int) -> a -> m (Step (MutArray a, Int) (MutArray a))
forall {m :: * -> *} {b}.
MonadIO m =>
(MutArray a, Int) -> a -> m (Step (MutArray a, Int) b)
step m (Step (MutArray a, Int) (MutArray a))
initial (MutArray a, Int) -> m (MutArray a)
forall {b} {b}. (b, b) -> m b
extract (MutArray a, Int) -> m (MutArray a)
forall {b} {b}. (b, b) -> m b
extract
where
initial :: m (Step (MutArray a, Int) (MutArray a))
initial = do
MutArray a
arr <- Int -> m (MutArray a)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> m (MutArray a)
MA.emptyOf' Int
n
if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0
then Step (MutArray a, Int) (MutArray a)
-> m (Step (MutArray a, Int) (MutArray a))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (MutArray a, Int) (MutArray a)
-> m (Step (MutArray a, Int) (MutArray a)))
-> Step (MutArray a, Int) (MutArray a)
-> m (Step (MutArray a, Int) (MutArray a))
forall a b. (a -> b) -> a -> b
$ MutArray a -> Step (MutArray a, Int) (MutArray a)
forall s b. b -> Step s b
Done MutArray a
arr
else Step (MutArray a, Int) (MutArray a)
-> m (Step (MutArray a, Int) (MutArray a))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (MutArray a, Int) (MutArray a)
-> m (Step (MutArray a, Int) (MutArray a)))
-> Step (MutArray a, Int) (MutArray a)
-> m (Step (MutArray a, Int) (MutArray a))
forall a b. (a -> b) -> a -> b
$ (MutArray a, Int) -> Step (MutArray a, Int) (MutArray a)
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 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n
then do
MutArray a
arr' <- MutArray a -> a -> m (MutArray a)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
MutArray a -> a -> m (MutArray a)
MA.snoc MutArray a
arr a
x
(a -> a -> Ordering) -> MutArray a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> MutArray a -> m ()
MA.bubble a -> a -> Ordering
cmp MutArray a
arr'
Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b))
-> Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b)
forall a b. (a -> b) -> a -> b
$ (MutArray a, Int) -> Step (MutArray a, Int) b
forall s b. s -> Step s b
Partial (MutArray a
arr', Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
else do
a
x1 <- Int -> MutArray a -> m a
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> MutArray a -> m a
MA.unsafeGetIndex (Int
i Int -> Int -> Int
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
Int -> MutArray a -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> MutArray a -> a -> m ()
MA.unsafePutIndex (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) MutArray a
arr a
x
(a -> a -> Ordering) -> MutArray a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> MutArray a -> m ()
MA.bubble a -> a -> Ordering
cmp MutArray a
arr
Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b))
-> Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b)
forall a b. (a -> b) -> a -> b
$ (MutArray a, Int) -> Step (MutArray a, Int) b
forall s b. s -> Step s b
Partial (MutArray a
arr, Int
i)
Ordering
_ -> Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b))
-> Step (MutArray a, Int) b -> m (Step (MutArray a, Int) b)
forall a b. (a -> b) -> a -> b
$ (MutArray a, Int) -> Step (MutArray a, Int) b
forall s b. s -> Step s b
Partial (MutArray a
arr, Int
i)
extract :: (b, b) -> m b
extract = b -> m b
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> ((b, b) -> b) -> (b, b) -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b, b) -> b
forall a b. (a, b) -> a
fst
{-# INLINE topBy #-}
topBy :: (MonadIO m, Unbox a) =>
(a -> a -> Ordering)
-> Int
-> Scanl m a (MutArray a)
topBy :: forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
topBy a -> a -> Ordering
cmp = (a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
bottomBy ((a -> a -> Ordering) -> a -> a -> Ordering
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 -> Scanl m a (MutArray a)
top :: forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Scanl m a (MutArray a)
top = (a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
bottomBy ((a -> a -> Ordering) -> Int -> Scanl m a (MutArray a))
-> (a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
forall a b. (a -> b) -> a -> b
$ (a -> a -> Ordering) -> a -> a -> Ordering
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
{-# INLINE bottom #-}
bottom :: (MonadIO m, Unbox a, Ord a) => Int -> Scanl m a (MutArray a)
bottom :: forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Scanl m a (MutArray a)
bottom = (a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
(a -> a -> Ordering) -> Int -> Scanl m a (MutArray a)
bottomBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare