{-# LANGUAGE UndecidableInstances #-}
#include "inline.hs"
module Streamly.Internal.Data.Stream.StreamK
(
Stream(..)
, mkStream
, nil
, nilM
, cons
, (.:)
, foldStream
, foldStreamShared
, unShare
, uncons
, unfoldr
, unfoldrM
, repeat
, repeatM
, replicate
, replicateM
, fromIndices
, fromIndicesM
, iterate
, iterateM
, fromPure
, fromEffect
, fromFoldable
, fromList
, foldrS
, foldrSM
, buildS
, augmentS
, foldr
, foldr1
, foldrM
, foldrT
, foldl'
, foldlM'
, foldlS
, foldlT
, foldlx'
, foldlMx'
, fold
, drain
, null
, head
, tail
, init
, elem
, notElem
, all
, any
, last
, minimum
, minimumBy
, maximum
, maximumBy
, findIndices
, lookup
, findM
, find
, (!!)
, mapM_
, toList
, hoist
, scanl'
, scanlx'
, filter
, take
, takeWhile
, drop
, dropWhile
, map
, mapM
, sequence
, intersperseM
, intersperse
, insertBy
, deleteBy
, reverse
, mapMaybe
, zipWith
, zipWithM
, mergeBy
, mergeByM
, concatMapWith
, concatMap
, bindWith
, concatPairsWith
, apWith
, apSerial
, apSerialDiscardFst
, apSerialDiscardSnd
, the
, serial
, consM
, withLocal
, mfix
)
where
import Control.Monad.Trans.Class (MonadTrans(lift))
import Control.Monad (void, join)
import Streamly.Internal.Data.SVar.Type (adaptState, defState)
import qualified Streamly.Internal.Data.Fold.Type as FL
import Prelude
hiding (foldl, foldr, last, map, mapM, mapM_, repeat, sequence,
take, filter, all, any, takeWhile, drop, dropWhile, minimum,
maximum, elem, notElem, null, head, tail, init, zipWith, lookup,
foldr1, (!!), replicate, reverse, concatMap, iterate)
import Streamly.Internal.Data.Stream.StreamK.Type
{-# INLINE unfoldrM #-}
unfoldrM :: Monad m => (b -> m (Maybe (a, b))) -> b -> Stream m a
unfoldrM :: forall (m :: * -> *) b a.
Monad m =>
(b -> m (Maybe (a, b))) -> b -> Stream m a
unfoldrM = forall (m :: * -> *) a b.
Monad m =>
(m a -> Stream m a -> Stream m a)
-> (b -> m (Maybe (a, b))) -> b -> Stream m a
unfoldrMWith forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
consM
repeatM :: Monad m => m a -> Stream m a
repeatM :: forall (m :: * -> *) a. Monad m => m a -> Stream m a
repeatM = forall (m :: * -> *) a (t :: (* -> *) -> * -> *).
(m a -> t m a -> t m a) -> m a -> t m a
repeatMWith forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
consM
{-# INLINE replicateM #-}
replicateM :: Monad m => Int -> m a -> Stream m a
replicateM :: forall (m :: * -> *) a. Monad m => Int -> m a -> Stream m a
replicateM = forall (m :: * -> *) a.
(m a -> Stream m a -> Stream m a) -> Int -> m a -> Stream m a
replicateMWith forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
consM
{-# INLINE replicate #-}
replicate :: Int -> a -> Stream m a
replicate :: forall a (m :: * -> *). Int -> a -> Stream m a
replicate Int
n a
a = forall {t} {m :: * -> *}. (Ord t, Num t) => t -> Stream m a
go Int
n
where
go :: t -> Stream m a
go t
cnt = if t
cnt forall a. Ord a => a -> a -> Bool
<= t
0 then forall (m :: * -> *) a. Stream m a
nil else a
a forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` t -> Stream m a
go (t
cnt forall a. Num a => a -> a -> a
- t
1)
{-# INLINE fromIndicesM #-}
fromIndicesM :: Monad m => (Int -> m a) -> Stream m a
fromIndicesM :: forall (m :: * -> *) a. Monad m => (Int -> m a) -> Stream m a
fromIndicesM = forall (m :: * -> *) a.
(m a -> Stream m a -> Stream m a) -> (Int -> m a) -> Stream m a
fromIndicesMWith forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
consM
{-# INLINE fromIndices #-}
fromIndices :: (Int -> a) -> Stream m a
fromIndices :: forall a (m :: * -> *). (Int -> a) -> Stream m a
fromIndices Int -> a
gen = forall {m :: * -> *}. Int -> Stream m a
go Int
0
where
go :: Int -> Stream m a
go Int
n = Int -> a
gen Int
n forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Int -> Stream m a
go (Int
n forall a. Num a => a -> a -> a
+ Int
1)
{-# INLINE iterate #-}
iterate :: (a -> a) -> a -> Stream m a
iterate :: forall a (m :: * -> *). (a -> a) -> a -> Stream m a
iterate a -> a
step = forall {m :: * -> *}. a -> Stream m a
go
where
go :: a -> Stream m a
go !a
s = forall a (m :: * -> *). a -> Stream m a -> Stream m a
cons a
s (a -> Stream m a
go (a -> a
step a
s))
{-# INLINE iterateM #-}
iterateM :: Monad m => (a -> m a) -> m a -> Stream m a
iterateM :: forall (m :: * -> *) a. Monad m => (a -> m a) -> m a -> Stream m a
iterateM = forall (m :: * -> *) a.
Monad m =>
(m a -> Stream m a -> Stream m a)
-> (a -> m a) -> m a -> Stream m a
iterateMWith forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
consM
{-# INLINE fromList #-}
fromList :: [a] -> Stream m a
fromList :: forall a (m :: * -> *). [a] -> Stream m a
fromList = forall (f :: * -> *) a (m :: * -> *).
Foldable f =>
f a -> Stream m a
fromFoldable
{-# INLINE foldr #-}
foldr :: Monad m => (a -> b -> b) -> b -> Stream m a -> m b
foldr :: forall (m :: * -> *) a b.
Monad m =>
(a -> b -> b) -> b -> Stream m a -> m b
foldr a -> b -> b
step b
acc = forall a (m :: * -> *) b.
(a -> m b -> m b) -> m b -> Stream m a -> m b
foldrM (\a
x m b
xs -> m b
xs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return (a -> b -> b
step a
x b
b)) (forall (m :: * -> *) a. Monad m => a -> m a
return b
acc)
{-# INLINE foldrT #-}
foldrT :: (Monad m, Monad (s m), MonadTrans s)
=> (a -> s m b -> s m b) -> s m b -> Stream m a -> s m b
foldrT :: forall (m :: * -> *) (s :: (* -> *) -> * -> *) a b.
(Monad m, Monad (s m), MonadTrans s) =>
(a -> s m b -> s m b) -> s m b -> Stream m a -> s m b
foldrT a -> s m b -> s m b
step s m b
final = Stream m a -> s m b
go
where
go :: Stream m a -> s m b
go Stream m a
m1 = do
Maybe (a, Stream m a)
res <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a.
Applicative m =>
Stream m a -> m (Maybe (a, Stream m a))
uncons Stream m a
m1
case Maybe (a, Stream m a)
res of
Just (a
h, Stream m a
t) -> a -> s m b -> s m b
step a
h (Stream m a -> s m b
go Stream m a
t)
Maybe (a, Stream m a)
Nothing -> s m b
final
{-# INLINE foldr1 #-}
foldr1 :: Monad m => (a -> a -> a) -> Stream m a -> m (Maybe a)
foldr1 :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> a) -> Stream m a -> m (Maybe a)
foldr1 a -> a -> a
step Stream m a
m = do
Maybe (a, Stream m a)
r <- forall (m :: * -> *) a.
Applicative m =>
Stream m a -> m (Maybe (a, Stream m a))
uncons Stream m a
m
case Maybe (a, Stream m a)
r of
Maybe (a, Stream m a)
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Just (a
h, Stream m a
t) -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just (forall {m :: * -> *}. Monad m => a -> Stream m a -> m a
go a
h Stream m a
t)
where
go :: a -> Stream m a -> m a
go a
p Stream m a
m1 =
let stp :: m a
stp = forall (m :: * -> *) a. Monad m => a -> m a
return a
p
single :: a -> m a
single a
a = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ a -> a -> a
step a
a a
p
yieldk :: a -> Stream m a -> m a
yieldk a
a Stream m a
r = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> a -> a
step a
p) (a -> Stream m a -> m a
go a
a Stream m a
r)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m a
yieldk forall {m :: * -> *}. Monad m => a -> m a
single m a
stp Stream m a
m1
{-# INLINABLE foldlMx' #-}
foldlMx' :: Monad m
=> (x -> a -> m x) -> m x -> (x -> m b) -> Stream m a -> m b
foldlMx' :: forall (m :: * -> *) x a b.
Monad m =>
(x -> a -> m x) -> m x -> (x -> m b) -> Stream m a -> m b
foldlMx' x -> a -> m x
step m x
begin x -> m b
done = m x -> Stream m a -> m b
go m x
begin
where
go :: m x -> Stream m a -> m b
go !m x
acc Stream m a
m1 =
let stop :: m b
stop = m x
acc forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= x -> m b
done
single :: a -> m b
single a
a = m x
acc forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \x
b -> x -> a -> m x
step x
b a
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= x -> m b
done
yieldk :: a -> Stream m a -> m b
yieldk a
a Stream m a
r = m x
acc forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \x
b -> x -> a -> m x
step x
b a
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \x
x -> m x -> Stream m a -> m b
go (forall (m :: * -> *) a. Monad m => a -> m a
return x
x) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m b
yieldk a -> m b
single m b
stop Stream m a
m1
{-# INLINABLE fold #-}
fold :: Monad m => FL.Fold m a b -> Stream m a -> m b
fold :: forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Stream m a -> m b
fold (FL.Fold s -> a -> m (Step s b)
step m (Step s b)
begin s -> m b
done) Stream m a
m = do
Step s b
res <- m (Step s b)
begin
case Step s b
res of
FL.Partial s
fs -> s -> Stream m a -> m b
go s
fs Stream m a
m
FL.Done b
fb -> forall (m :: * -> *) a. Monad m => a -> m a
return b
fb
where
go :: s -> Stream m a -> m b
go !s
acc Stream m a
m1 =
let stop :: m b
stop = s -> m b
done s
acc
single :: a -> m b
single a
a = s -> a -> m (Step s b)
step s
acc a
a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
FL.Partial s
s -> s -> m b
done s
s
FL.Done b
b1 -> forall (m :: * -> *) a. Monad m => a -> m a
return b
b1
yieldk :: a -> Stream m a -> m b
yieldk a
a Stream m a
r = s -> a -> m (Step s b)
step s
acc a
a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
FL.Partial s
s -> s -> Stream m a -> m b
go s
s Stream m a
r
FL.Done b
b1 -> forall (m :: * -> *) a. Monad m => a -> m a
return b
b1
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m b
yieldk a -> m b
single m b
stop Stream m a
m1
{-# INLINE foldlM' #-}
foldlM' :: Monad m => (b -> a -> m b) -> m b -> Stream m a -> m b
foldlM' :: forall (m :: * -> *) b a.
Monad m =>
(b -> a -> m b) -> m b -> Stream m a -> m b
foldlM' b -> a -> m b
step m b
begin = forall (m :: * -> *) x a b.
Monad m =>
(x -> a -> m x) -> m x -> (x -> m b) -> Stream m a -> m b
foldlMx' b -> a -> m b
step m b
begin forall (m :: * -> *) a. Monad m => a -> m a
return
{-# INLINE foldlT #-}
foldlT :: (Monad m, Monad (s m), MonadTrans s)
=> (s m b -> a -> s m b) -> s m b -> Stream m a -> s m b
foldlT :: forall (m :: * -> *) (s :: (* -> *) -> * -> *) b a.
(Monad m, Monad (s m), MonadTrans s) =>
(s m b -> a -> s m b) -> s m b -> Stream m a -> s m b
foldlT s m b -> a -> s m b
step = s m b -> Stream m a -> s m b
go
where
go :: s m b -> Stream m a -> s m b
go s m b
acc Stream m a
m1 = do
Maybe (a, Stream m a)
res <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a.
Applicative m =>
Stream m a -> m (Maybe (a, Stream m a))
uncons Stream m a
m1
case Maybe (a, Stream m a)
res of
Just (a
h, Stream m a
t) -> s m b -> Stream m a -> s m b
go (s m b -> a -> s m b
step s m b
acc a
h) Stream m a
t
Maybe (a, Stream m a)
Nothing -> s m b
acc
{-# INLINE head #-}
head :: Monad m => Stream m a -> m (Maybe a)
head :: forall (m :: * -> *) a. Monad m => Stream m a -> m (Maybe a)
head Stream m a
m =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
single :: a -> m (Maybe a)
single a
a = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
yieldk :: a -> p -> m (Maybe a)
yieldk a
a p
_ = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState forall {m :: * -> *} {a} {p}. Monad m => a -> p -> m (Maybe a)
yieldk forall {m :: * -> *} {a}. Monad m => a -> m (Maybe a)
single forall {a}. m (Maybe a)
stop Stream m a
m
{-# INLINE elem #-}
elem :: (Monad m, Eq a) => a -> Stream m a -> m Bool
elem :: forall (m :: * -> *) a.
(Monad m, Eq a) =>
a -> Stream m a -> m Bool
elem a
e = forall {m :: * -> *}. Monad m => Stream m a -> m Bool
go
where
go :: Stream m a -> m Bool
go Stream m a
m1 =
let stop :: m Bool
stop = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
single :: a -> m Bool
single a
a = forall (m :: * -> *) a. Monad m => a -> m a
return (a
a forall a. Eq a => a -> a -> Bool
== a
e)
yieldk :: a -> Stream m a -> m Bool
yieldk a
a Stream m a
r = if a
a forall a. Eq a => a -> a -> Bool
== a
e then forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True else Stream m a -> m Bool
go Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m Bool
yieldk forall {m :: * -> *}. Monad m => a -> m Bool
single m Bool
stop Stream m a
m1
{-# INLINE notElem #-}
notElem :: (Monad m, Eq a) => a -> Stream m a -> m Bool
notElem :: forall (m :: * -> *) a.
(Monad m, Eq a) =>
a -> Stream m a -> m Bool
notElem a
e = forall {m :: * -> *}. Monad m => Stream m a -> m Bool
go
where
go :: Stream m a -> m Bool
go Stream m a
m1 =
let stop :: m Bool
stop = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
single :: a -> m Bool
single a
a = forall (m :: * -> *) a. Monad m => a -> m a
return (a
a forall a. Eq a => a -> a -> Bool
/= a
e)
yieldk :: a -> Stream m a -> m Bool
yieldk a
a Stream m a
r = if a
a forall a. Eq a => a -> a -> Bool
== a
e then forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False else Stream m a -> m Bool
go Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m Bool
yieldk forall {m :: * -> *}. Monad m => a -> m Bool
single m Bool
stop Stream m a
m1
{-# INLINABLE all #-}
all :: Monad m => (a -> Bool) -> Stream m a -> m Bool
all :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Stream m a -> m Bool
all a -> Bool
p = forall {m :: * -> *}. Monad m => Stream m a -> m Bool
go
where
go :: Stream m a -> m Bool
go Stream m a
m1 =
let single :: a -> m Bool
single a
a | a -> Bool
p a
a = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
yieldk :: a -> Stream m a -> m Bool
yieldk a
a Stream m a
r | a -> Bool
p a
a = Stream m a -> m Bool
go Stream m a
r
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m Bool
yieldk forall {m :: * -> *}. Monad m => a -> m Bool
single (forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True) Stream m a
m1
{-# INLINABLE any #-}
any :: Monad m => (a -> Bool) -> Stream m a -> m Bool
any :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Stream m a -> m Bool
any a -> Bool
p = forall {m :: * -> *}. Monad m => Stream m a -> m Bool
go
where
go :: Stream m a -> m Bool
go Stream m a
m1 =
let single :: a -> m Bool
single a
a | a -> Bool
p a
a = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
yieldk :: a -> Stream m a -> m Bool
yieldk a
a Stream m a
r | a -> Bool
p a
a = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
| Bool
otherwise = Stream m a -> m Bool
go Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m Bool
yieldk forall {m :: * -> *}. Monad m => a -> m Bool
single (forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False) Stream m a
m1
{-# INLINE last #-}
last :: Monad m => Stream m a -> m (Maybe a)
last :: forall (m :: * -> *) a. Monad m => Stream m a -> m (Maybe a)
last = forall (m :: * -> *) a b x.
Monad m =>
(x -> a -> x) -> x -> (x -> b) -> Stream m a -> m b
foldlx' (\Maybe a
_ a
y -> forall a. a -> Maybe a
Just a
y) forall a. Maybe a
Nothing forall a. a -> a
id
{-# INLINE minimum #-}
minimum :: (Monad m, Ord a) => Stream m a -> m (Maybe a)
minimum :: forall (m :: * -> *) a.
(Monad m, Ord a) =>
Stream m a -> m (Maybe a)
minimum = forall {m :: * -> *} {a}.
(Ord a, Monad m) =>
Maybe a -> Stream m a -> m (Maybe a)
go forall a. Maybe a
Nothing
where
go :: Maybe a -> Stream m a -> m (Maybe a)
go Maybe a
Nothing Stream m a
m1 =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
single :: a -> m (Maybe a)
single a
a = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r = Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
a) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *} {a}. Monad m => a -> m (Maybe a)
single forall {a}. m (Maybe a)
stop Stream m a
m1
go (Just a
res) Stream m a
m1 =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
res)
single :: a -> m (Maybe a)
single a
a =
if a
res forall a. Ord a => a -> a -> Bool
<= a
a
then forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
res)
else forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r =
if a
res forall a. Ord a => a -> a -> Bool
<= a
a
then Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
res) Stream m a
r
else Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
a) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *}. Monad m => a -> m (Maybe a)
single m (Maybe a)
stop Stream m a
m1
{-# INLINE minimumBy #-}
minimumBy
:: (Monad m)
=> (a -> a -> Ordering) -> Stream m a -> m (Maybe a)
minimumBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Ordering) -> Stream m a -> m (Maybe a)
minimumBy a -> a -> Ordering
cmp = forall {m :: * -> *}.
Monad m =>
Maybe a -> Stream m a -> m (Maybe a)
go forall a. Maybe a
Nothing
where
go :: Maybe a -> Stream m a -> m (Maybe a)
go Maybe a
Nothing Stream m a
m1 =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
single :: a -> m (Maybe a)
single a
a = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r = Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
a) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *} {a}. Monad m => a -> m (Maybe a)
single forall {a}. m (Maybe a)
stop Stream m a
m1
go (Just a
res) Stream m a
m1 =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
res)
single :: a -> m (Maybe a)
single a
a = case a -> a -> Ordering
cmp a
res a
a of
Ordering
GT -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
Ordering
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
res)
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r = case a -> a -> Ordering
cmp a
res a
a of
Ordering
GT -> Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
a) Stream m a
r
Ordering
_ -> Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
res) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *}. Monad m => a -> m (Maybe a)
single m (Maybe a)
stop Stream m a
m1
{-# INLINE maximum #-}
maximum :: (Monad m, Ord a) => Stream m a -> m (Maybe a)
maximum :: forall (m :: * -> *) a.
(Monad m, Ord a) =>
Stream m a -> m (Maybe a)
maximum = forall {m :: * -> *} {a}.
(Ord a, Monad m) =>
Maybe a -> Stream m a -> m (Maybe a)
go forall a. Maybe a
Nothing
where
go :: Maybe a -> Stream m a -> m (Maybe a)
go Maybe a
Nothing Stream m a
m1 =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
single :: a -> m (Maybe a)
single a
a = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r = Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
a) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *} {a}. Monad m => a -> m (Maybe a)
single forall {a}. m (Maybe a)
stop Stream m a
m1
go (Just a
res) Stream m a
m1 =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
res)
single :: a -> m (Maybe a)
single a
a =
if a
res forall a. Ord a => a -> a -> Bool
<= a
a
then forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
else forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
res)
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r =
if a
res forall a. Ord a => a -> a -> Bool
<= a
a
then Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
a) Stream m a
r
else Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
res) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *}. Monad m => a -> m (Maybe a)
single m (Maybe a)
stop Stream m a
m1
{-# INLINE maximumBy #-}
maximumBy :: Monad m => (a -> a -> Ordering) -> Stream m a -> m (Maybe a)
maximumBy :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> Ordering) -> Stream m a -> m (Maybe a)
maximumBy a -> a -> Ordering
cmp = forall {m :: * -> *}.
Monad m =>
Maybe a -> Stream m a -> m (Maybe a)
go forall a. Maybe a
Nothing
where
go :: Maybe a -> Stream m a -> m (Maybe a)
go Maybe a
Nothing Stream m a
m1 =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
single :: a -> m (Maybe a)
single a
a = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r = Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
a) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *} {a}. Monad m => a -> m (Maybe a)
single forall {a}. m (Maybe a)
stop Stream m a
m1
go (Just a
res) Stream m a
m1 =
let stop :: m (Maybe a)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
res)
single :: a -> m (Maybe a)
single a
a = case a -> a -> Ordering
cmp a
res a
a of
Ordering
GT -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
res)
Ordering
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
a)
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r = case a -> a -> Ordering
cmp a
res a
a of
Ordering
GT -> Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
res) Stream m a
r
Ordering
_ -> Maybe a -> Stream m a -> m (Maybe a)
go (forall a. a -> Maybe a
Just a
a) Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *}. Monad m => a -> m (Maybe a)
single m (Maybe a)
stop Stream m a
m1
{-# INLINE (!!) #-}
(!!) :: Monad m => Stream m a -> Int -> m (Maybe a)
Stream m a
m !! :: forall (m :: * -> *) a. Monad m => Stream m a -> Int -> m (Maybe a)
!! Int
i = forall {m :: * -> *} {t} {a}.
(Ord t, Monad m, Num t) =>
t -> Stream m a -> m (Maybe a)
go Int
i Stream m a
m
where
go :: t -> Stream m a -> m (Maybe a)
go t
n Stream m a
m1 =
let single :: a -> m (Maybe a)
single a
a | t
n forall a. Eq a => a -> a -> Bool
== t
0 = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
a
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
x | t
n forall a. Ord a => a -> a -> Bool
< t
0 = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
| t
n forall a. Eq a => a -> a -> Bool
== t
0 = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
a
| Bool
otherwise = t -> Stream m a -> m (Maybe a)
go (t
n forall a. Num a => a -> a -> a
- t
1) Stream m a
x
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *} {a}. Monad m => a -> m (Maybe a)
single (forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing) Stream m a
m1
{-# INLINE lookup #-}
lookup :: (Monad m, Eq a) => a -> Stream m (a, b) -> m (Maybe b)
lookup :: forall (m :: * -> *) a b.
(Monad m, Eq a) =>
a -> Stream m (a, b) -> m (Maybe b)
lookup a
e = forall {m :: * -> *} {a}. Monad m => Stream m (a, a) -> m (Maybe a)
go
where
go :: Stream m (a, a) -> m (Maybe a)
go Stream m (a, a)
m1 =
let single :: (a, a) -> m (Maybe a)
single (a
a, a
b) | a
a forall a. Eq a => a -> a -> Bool
== a
e = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
b
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
yieldk :: (a, a) -> Stream m (a, a) -> m (Maybe a)
yieldk (a
a, a
b) Stream m (a, a)
x | a
a forall a. Eq a => a -> a -> Bool
== a
e = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
b
| Bool
otherwise = Stream m (a, a) -> m (Maybe a)
go Stream m (a, a)
x
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState (a, a) -> Stream m (a, a) -> m (Maybe a)
yieldk forall {m :: * -> *} {a}. Monad m => (a, a) -> m (Maybe a)
single (forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing) Stream m (a, a)
m1
{-# INLINE findM #-}
findM :: Monad m => (a -> m Bool) -> Stream m a -> m (Maybe a)
findM :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Stream m a -> m (Maybe a)
findM a -> m Bool
p = Stream m a -> m (Maybe a)
go
where
go :: Stream m a -> m (Maybe a)
go Stream m a
m1 =
let single :: a -> m (Maybe a)
single a
a = do
Bool
b <- a -> m Bool
p a
a
if Bool
b then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
a else forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
x = do
Bool
b <- a -> m Bool
p a
a
if Bool
b then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
a else Stream m a -> m (Maybe a)
go Stream m a
x
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk a -> m (Maybe a)
single (forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing) Stream m a
m1
{-# INLINE find #-}
find :: Monad m => (a -> Bool) -> Stream m a -> m (Maybe a)
find :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> Stream m a -> m (Maybe a)
find a -> Bool
p = forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> Stream m a -> m (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 findIndices #-}
findIndices :: (a -> Bool) -> Stream m a -> Stream m Int
findIndices :: forall a (m :: * -> *). (a -> Bool) -> Stream m a -> Stream m Int
findIndices a -> Bool
p = forall {t} {m :: * -> *}. Num t => t -> Stream m a -> Stream m t
go Int
0
where
go :: t -> Stream m a -> Stream m t
go t
offset Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m t
st t -> Stream m t -> m r
yld t -> m r
sng m r
stp ->
let single :: a -> m r
single a
a | a -> Bool
p a
a = t -> m r
sng t
offset
| Bool
otherwise = m r
stp
yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
x | a -> Bool
p a
a = t -> Stream m t -> m r
yld t
offset forall a b. (a -> b) -> a -> b
$ t -> Stream m a -> Stream m t
go (t
offset forall a. Num a => a -> a -> a
+ t
1) Stream m a
x
| Bool
otherwise = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m t
st) t -> Stream m t -> m r
yld t -> m r
sng m r
stp forall a b. (a -> b) -> a -> b
$
t -> Stream m a -> Stream m t
go (t
offset forall a. Num a => a -> a -> a
+ t
1) Stream m a
x
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m t
st) a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
m1
{-# INLINE mapM_ #-}
mapM_ :: Monad m => (a -> m b) -> Stream m a -> m ()
mapM_ :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Stream m a -> m ()
mapM_ a -> m b
f = Stream m a -> m ()
go
where
go :: Stream m a -> m ()
go Stream m a
m1 =
let stop :: m ()
stop = forall (m :: * -> *) a. Monad m => a -> m a
return ()
single :: a -> m ()
single a
a = forall (f :: * -> *) a. Functor f => f a -> f ()
void (a -> m b
f a
a)
yieldk :: a -> Stream m a -> m ()
yieldk a
a Stream m a
r = a -> m b
f a
a forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Stream m a -> m ()
go Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m ()
yieldk a -> m ()
single m ()
stop Stream m a
m1
{-# INLINE mapM #-}
mapM :: Monad m => (a -> m b) -> Stream m a -> Stream m b
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Stream m a -> Stream m b
mapM = forall (m :: * -> *) b a.
(m b -> Stream m b -> Stream m b)
-> (a -> m b) -> Stream m a -> Stream m b
mapMWith forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
consM
{-# INLINABLE toList #-}
toList :: Monad m => Stream m a -> m [a]
toList :: forall (m :: * -> *) a. Monad m => Stream m a -> m [a]
toList = forall (m :: * -> *) a b.
Monad m =>
(a -> b -> b) -> b -> Stream m a -> m b
foldr (:) []
{-# INLINE hoist #-}
hoist :: (Monad m, Monad n)
=> (forall x. m x -> n x) -> Stream m a -> Stream n a
hoist :: forall (m :: * -> *) (n :: * -> *) a.
(Monad m, Monad n) =>
(forall x. m x -> n x) -> Stream m a -> Stream n a
hoist forall x. m x -> n x
f Stream m a
str =
forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream n a
st a -> Stream n a -> n r
yld a -> n r
sng n r
stp ->
let single :: a -> m (n r)
single = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> n r
sng
yieldk :: a -> Stream m a -> m (n r)
yieldk a
a Stream m a
s = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ a -> Stream n a -> n r
yld a
a (forall (m :: * -> *) (n :: * -> *) a.
(Monad m, Monad n) =>
(forall x. m x -> n x) -> Stream m a -> Stream n a
hoist forall x. m x -> n x
f Stream m a
s)
stop :: m (n r)
stop = forall (m :: * -> *) a. Monad m => a -> m a
return n r
stp
state :: State Stream n b
state = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream n a
st
in forall (m :: * -> *) a. Monad m => m (m a) -> m a
join forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. m x -> n x
f forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStreamShared forall {n :: * -> *} {b}. State Stream n b
state forall {m :: * -> *}. Monad m => a -> Stream m a -> m (n r)
yieldk a -> m (n r)
single m (n r)
stop Stream m a
str
{-# INLINE scanlx' #-}
scanlx' :: (x -> a -> x) -> x -> (x -> b) -> Stream m a -> Stream m b
scanlx' :: forall x a b (m :: * -> *).
(x -> a -> x) -> x -> (x -> b) -> Stream m a -> Stream m b
scanlx' x -> a -> x
step x
begin x -> b
done Stream m a
m =
forall a (m :: * -> *). a -> Stream m a -> Stream m a
cons (x -> b
done x
begin) forall a b. (a -> b) -> a -> b
$ forall {m :: * -> *}. Stream m a -> x -> Stream m b
go Stream m a
m x
begin
where
go :: Stream m a -> x -> Stream m b
go Stream m a
m1 !x
acc = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m b
st b -> Stream m b -> m r
yld b -> m r
sng m r
stp ->
let single :: a -> m r
single a
a = b -> m r
sng (x -> b
done forall a b. (a -> b) -> a -> b
$ x -> a -> x
step x
acc a
a)
yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
r =
let s :: x
s = x -> a -> x
step x
acc a
a
in b -> Stream m b -> m r
yld (x -> b
done x
s) (Stream m a -> x -> Stream m b
go Stream m a
r x
s)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m b
st) a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
m1
{-# INLINE scanl' #-}
scanl' :: (b -> a -> b) -> b -> Stream m a -> Stream m b
scanl' :: forall b a (m :: * -> *).
(b -> a -> b) -> b -> Stream m a -> Stream m b
scanl' b -> a -> b
step b
begin = forall x a b (m :: * -> *).
(x -> a -> x) -> x -> (x -> b) -> Stream m a -> Stream m b
scanlx' b -> a -> b
step b
begin forall a. a -> a
id
{-# INLINE filter #-}
filter :: (a -> Bool) -> Stream m a -> Stream m a
filter :: forall a (m :: * -> *). (a -> Bool) -> Stream m a -> Stream m a
filter a -> Bool
p = forall {m :: * -> *}. Stream m a -> Stream m a
go
where
go :: Stream m a -> Stream m a
go Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let single :: a -> m r
single a
a | a -> Bool
p a
a = a -> m r
sng a
a
| Bool
otherwise = m r
stp
yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
r | a -> Bool
p a
a = a -> Stream m a -> m r
yld a
a (Stream m a -> Stream m a
go Stream m a
r)
| Bool
otherwise = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
m1
{-# INLINE take #-}
take :: Int -> Stream m a -> Stream m a
take :: forall (m :: * -> *) a. Int -> Stream m a -> Stream m a
take = forall {t} {m :: * -> *} {a}.
(Ord t, Num t) =>
t -> Stream m a -> Stream m a
go
where
go :: t -> Stream m a -> Stream m a
go t
n1 Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
r = a -> Stream m a -> m r
yld a
a (t -> Stream m a -> Stream m a
go (t
n1 forall a. Num a => a -> a -> a
- t
1) Stream m a
r)
in if t
n1 forall a. Ord a => a -> a -> Bool
<= t
0
then m r
stp
else forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
sng m r
stp Stream m a
m1
{-# INLINE takeWhile #-}
takeWhile :: (a -> Bool) -> Stream m a -> Stream m a
takeWhile :: forall a (m :: * -> *). (a -> Bool) -> Stream m a -> Stream m a
takeWhile a -> Bool
p = forall {m :: * -> *}. Stream m a -> Stream m a
go
where
go :: Stream m a -> Stream m a
go Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let single :: a -> m r
single a
a | a -> Bool
p a
a = a -> m r
sng a
a
| Bool
otherwise = m r
stp
yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
r | a -> Bool
p a
a = a -> Stream m a -> m r
yld a
a (Stream m a -> Stream m a
go Stream m a
r)
| Bool
otherwise = m r
stp
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
m1
{-# INLINE drop #-}
drop :: Int -> Stream m a -> Stream m a
drop :: forall (m :: * -> *) a. Int -> Stream m a -> Stream m a
drop Int
n Stream m a
m = forall (m :: * -> *) a. Stream m a -> Stream m a
unShare (forall {t} {m :: * -> *} {a}.
(Ord t, Num t) =>
t -> Stream m a -> Stream m a
go Int
n Stream m a
m)
where
go :: t -> Stream m a -> Stream m a
go t
n1 Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let single :: p -> m r
single p
_ = m r
stp
yieldk :: p -> Stream m a -> m r
yieldk p
_ Stream m a
r = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStreamShared State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp forall a b. (a -> b) -> a -> b
$ t -> Stream m a -> Stream m a
go (t
n1 forall a. Num a => a -> a -> a
- t
1) Stream m a
r
in if t
n1 forall a. Ord a => a -> a -> Bool
<= t
0
then forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStreamShared State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp Stream m a
m1
else forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStreamShared State Stream m a
st forall {p}. p -> Stream m a -> m r
yieldk forall {p}. p -> m r
single m r
stp Stream m a
m1
{-# INLINE dropWhile #-}
dropWhile :: (a -> Bool) -> Stream m a -> Stream m a
dropWhile :: forall a (m :: * -> *). (a -> Bool) -> Stream m a -> Stream m a
dropWhile a -> Bool
p = forall {m :: * -> *}. Stream m a -> Stream m a
go
where
go :: Stream m a -> Stream m a
go Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let single :: a -> m r
single a
a | a -> Bool
p a
a = m r
stp
| Bool
otherwise = a -> m r
sng a
a
yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
r | a -> Bool
p a
a = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
r
| Bool
otherwise = a -> Stream m a -> m r
yld a
a Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
m1
{-# INLINE sequence #-}
sequence :: Monad m => Stream m (m a) -> Stream m a
sequence :: forall (m :: * -> *) a. Monad m => Stream m (m a) -> Stream m a
sequence = forall (m :: * -> *) a. Monad m => Stream m (m a) -> Stream m a
go
where
go :: Stream m (m a) -> Stream m a
go Stream m (m a)
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let single :: m a -> m r
single m a
ma = m a
ma forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> m r
sng
yieldk :: m a -> Stream m (m a) -> m r
yieldk m a
ma Stream m (m a)
r = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStreamShared State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp forall a b. (a -> b) -> a -> b
$ m a
ma forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
`consM` Stream m (m a) -> Stream m a
go Stream m (m a)
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
st) m a -> Stream m (m a) -> m r
yieldk m a -> m r
single m r
stp Stream m (m a)
m1
{-# INLINE intersperseM #-}
intersperseM :: Monad m => m a -> Stream m a -> Stream m a
intersperseM :: forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
intersperseM m a
a = Stream m a -> Stream m a
prependingStart
where
prependingStart :: Stream m a -> Stream m a
prependingStart Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let yieldk :: a -> Stream m a -> m r
yieldk a
i Stream m a
x =
forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStreamShared State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return a
i forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
`consM` Stream m a -> Stream m a
go Stream m a
x
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
sng m r
stp Stream m a
m1
go :: Stream m a -> Stream m a
go Stream m a
m2 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let single :: a -> m r
single a
i = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStreamShared State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp forall a b. (a -> b) -> a -> b
$ m a
a forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
`consM` forall a (m :: * -> *). a -> Stream m a
fromPure a
i
yieldk :: a -> Stream m a -> m r
yieldk a
i Stream m a
x =
forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStreamShared
State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp forall a b. (a -> b) -> a -> b
$ m a
a forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
`consM` forall (m :: * -> *) a. Monad m => a -> m a
return a
i forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
`consM` Stream m a -> Stream m a
go Stream m a
x
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
m2
{-# INLINE intersperse #-}
intersperse :: Monad m => a -> Stream m a -> Stream m a
intersperse :: forall (m :: * -> *) a. Monad m => a -> Stream m a -> Stream m a
intersperse a
a = forall (m :: * -> *) a. Monad m => m a -> Stream m a -> Stream m a
intersperseM (forall (m :: * -> *) a. Monad m => a -> m a
return a
a)
{-# INLINE insertBy #-}
insertBy :: (a -> a -> Ordering) -> a -> Stream m a -> Stream m a
insertBy :: forall a (m :: * -> *).
(a -> a -> Ordering) -> a -> Stream m a -> Stream m a
insertBy a -> a -> Ordering
cmp a
x = forall {m :: * -> *}. Stream m a -> Stream m a
go
where
go :: Stream m a -> Stream m a
go Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
_ m r
_ ->
let single :: a -> m r
single a
a = case a -> a -> Ordering
cmp a
x a
a of
Ordering
GT -> a -> Stream m a -> m r
yld a
a (forall a (m :: * -> *). a -> Stream m a
fromPure a
x)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (forall a (m :: * -> *). a -> Stream m a
fromPure a
a)
stop :: m r
stop = a -> Stream m a -> m r
yld a
x forall (m :: * -> *) a. Stream m a
nil
yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
r = case a -> a -> Ordering
cmp a
x a
a of
Ordering
GT -> a -> Stream m a -> m r
yld a
a (Stream m a -> Stream m a
go Stream m a
r)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (a
a forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
r)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
single m r
stop Stream m a
m1
{-# INLINE deleteBy #-}
deleteBy :: (a -> a -> Bool) -> a -> Stream m a -> Stream m a
deleteBy :: forall a (m :: * -> *).
(a -> a -> Bool) -> a -> Stream m a -> Stream m a
deleteBy a -> a -> Bool
eq a
x = forall {m :: * -> *}. Stream m a -> Stream m a
go
where
go :: Stream m a -> Stream m a
go Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let single :: a -> m r
single a
a = if a -> a -> Bool
eq a
x a
a then m r
stp else a -> m r
sng a
a
yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
r = if a -> a -> Bool
eq a
x a
a
then forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp Stream m a
r
else a -> Stream m a -> m r
yld a
a (Stream m a -> Stream m a
go Stream m a
r)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
m1
{-# INLINE mapMaybe #-}
mapMaybe :: (a -> Maybe b) -> Stream m a -> Stream m b
mapMaybe :: forall a b (m :: * -> *).
(a -> Maybe b) -> Stream m a -> Stream m b
mapMaybe a -> Maybe b
f = forall {m :: * -> *}. Stream m a -> Stream m b
go
where
go :: Stream m a -> Stream m b
go Stream m a
m1 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m b
st b -> Stream m b -> m r
yld b -> m r
sng m r
stp ->
let single :: a -> m r
single a
a = forall b a. b -> (a -> b) -> Maybe a -> b
maybe m r
stp b -> m r
sng (a -> Maybe b
f a
a)
yieldk :: a -> Stream m a -> m r
yieldk a
a Stream m a
r = case a -> Maybe b
f a
a of
Just b
b -> b -> Stream m b -> m r
yld b
b forall a b. (a -> b) -> a -> b
$ Stream m a -> Stream m b
go Stream m a
r
Maybe b
Nothing -> forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m b
st) a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
r
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m b
st) a -> Stream m a -> m r
yieldk a -> m r
single m r
stp Stream m a
m1
{-# INLINE zipWith #-}
zipWith :: Monad m => (a -> b -> c) -> Stream m a -> Stream m b -> Stream m c
zipWith :: forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> Stream m a -> Stream m b -> Stream m c
zipWith a -> b -> c
f = forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> Stream m a -> Stream m b -> Stream m c
zipWithM (\a
a b
b -> forall (m :: * -> *) a. Monad m => a -> m a
return (a -> b -> c
f a
a b
b))
{-# INLINE zipWithM #-}
zipWithM :: Monad m =>
(a -> b -> m c) -> Stream m a -> Stream m b -> Stream m c
zipWithM :: forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> Stream m a -> Stream m b -> Stream m c
zipWithM a -> b -> m c
f = Stream m a -> Stream m b -> Stream m c
go
where
go :: Stream m a -> Stream m b -> Stream m c
go Stream m a
mx Stream m b
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m c
st c -> Stream m c -> m r
yld c -> m r
sng m r
stp -> do
let merge :: a -> Stream m a -> m r
merge a
a Stream m a
ra =
let single2 :: b -> m r
single2 b
b = a -> b -> m c
f a
a b
b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= c -> m r
sng
yield2 :: b -> Stream m b -> m r
yield2 b
b Stream m b
rb = a -> b -> m c
f a
a b
b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \c
x -> c -> Stream m c -> m r
yld c
x (Stream m a -> Stream m b -> Stream m c
go Stream m a
ra Stream m b
rb)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m c
st) b -> Stream m b -> m r
yield2 b -> m r
single2 m r
stp Stream m b
my
let single1 :: a -> m r
single1 a
a = a -> Stream m a -> m r
merge a
a forall (m :: * -> *) a. Stream m a
nil
yield1 :: a -> Stream m a -> m r
yield1 = a -> Stream m a -> m r
merge
forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m c
st) a -> Stream m a -> m r
yield1 a -> m r
single1 m r
stp Stream m a
mx
{-# INLINE mergeByM #-}
mergeByM :: Monad m =>
(a -> a -> m Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeByM :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> m Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeByM a -> a -> m Ordering
cmp = Stream m a -> Stream m a -> Stream m a
go
where
go :: Stream m a -> Stream m a -> Stream m a
go Stream m a
mx Stream m a
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp -> do
let stop :: m r
stop = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp Stream m a
my
single :: a -> m r
single a
x = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp (a -> Stream m a -> Stream m a
goX0 a
x Stream m a
my)
yield :: a -> Stream m a -> m r
yield a
x Stream m a
rx = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp (a -> Stream m a -> Stream m a -> Stream m a
goX a
x Stream m a
rx Stream m a
my)
forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
mx
goX0 :: a -> Stream m a -> Stream m a
goX0 a
x Stream m a
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
_ -> do
let stop :: m r
stop = a -> m r
sng a
x
single :: a -> m r
single a
y = do
Ordering
r <- a -> a -> m Ordering
cmp a
x a
y
case Ordering
r of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (forall a (m :: * -> *). a -> Stream m a
fromPure a
x)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (forall a (m :: * -> *). a -> Stream m a
fromPure a
y)
yield :: a -> Stream m a -> m r
yield a
y Stream m a
ry = do
Ordering
r <- a -> a -> m Ordering
cmp a
x a
y
case Ordering
r of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a -> Stream m a -> Stream m a
goX0 a
x Stream m a
ry)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (a
y forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
ry)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
my
goX :: a -> Stream m a -> Stream m a -> Stream m a
goX a
x Stream m a
mx Stream m a
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
_ m r
_ -> do
let stop :: m r
stop = a -> Stream m a -> m r
yld a
x Stream m a
mx
single :: a -> m r
single a
y = do
Ordering
r <- a -> a -> m Ordering
cmp a
x a
y
case Ordering
r of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a
x forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
mx)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (Stream m a -> a -> Stream m a
goY0 Stream m a
mx a
y)
yield :: a -> Stream m a -> m r
yield a
y Stream m a
ry = do
Ordering
r <- a -> a -> m Ordering
cmp a
x a
y
case Ordering
r of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a -> Stream m a -> Stream m a -> Stream m a
goX a
x Stream m a
mx Stream m a
ry)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (Stream m a -> a -> Stream m a -> Stream m a
goY Stream m a
mx a
y Stream m a
ry)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
my
goY0 :: Stream m a -> a -> Stream m a
goY0 Stream m a
mx a
y = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
_ -> do
let stop :: m r
stop = a -> m r
sng a
y
single :: a -> m r
single a
x = do
Ordering
r <- a -> a -> m Ordering
cmp a
x a
y
case Ordering
r of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (forall a (m :: * -> *). a -> Stream m a
fromPure a
x)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (forall a (m :: * -> *). a -> Stream m a
fromPure a
y)
yield :: a -> Stream m a -> m r
yield a
x Stream m a
rx = do
Ordering
r <- a -> a -> m Ordering
cmp a
x a
y
case Ordering
r of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a
x forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
rx)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (Stream m a -> a -> Stream m a
goY0 Stream m a
rx a
y)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
mx
goY :: Stream m a -> a -> Stream m a -> Stream m a
goY Stream m a
mx a
y Stream m a
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
_ m r
_ -> do
let stop :: m r
stop = a -> Stream m a -> m r
yld a
y Stream m a
my
single :: a -> m r
single a
x = do
Ordering
r <- a -> a -> m Ordering
cmp a
x a
y
case Ordering
r of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a -> Stream m a -> Stream m a
goX0 a
x Stream m a
my)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (a
y forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
my)
yield :: a -> Stream m a -> m r
yield a
x Stream m a
rx = do
Ordering
r <- a -> a -> m Ordering
cmp a
x a
y
case Ordering
r of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a -> Stream m a -> Stream m a -> Stream m a
goX a
x Stream m a
rx Stream m a
my)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (Stream m a -> a -> Stream m a -> Stream m a
goY Stream m a
rx a
y Stream m a
my)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
mx
{-# INLINE mergeBy #-}
mergeBy :: (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeBy :: forall a (m :: * -> *).
(a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
mergeBy a -> a -> Ordering
cmp = forall {m :: * -> *}. Stream m a -> Stream m a -> Stream m a
go
where
go :: Stream m a -> Stream m a -> Stream m a
go Stream m a
mx Stream m a
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp -> do
let stop :: m r
stop = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp Stream m a
my
single :: a -> m r
single a
x = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp (forall {m :: * -> *}. a -> Stream m a -> Stream m a
goX0 a
x Stream m a
my)
yield :: a -> Stream m a -> m r
yield a
x Stream m a
rx = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp (forall {m :: * -> *}. a -> Stream m a -> Stream m a -> Stream m a
goX a
x Stream m a
rx Stream m a
my)
forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
mx
goX0 :: a -> Stream m a -> Stream m a
goX0 a
x Stream m a
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
_ -> do
let stop :: m r
stop = a -> m r
sng a
x
single :: a -> m r
single a
y = do
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (forall a (m :: * -> *). a -> Stream m a
fromPure a
x)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (forall a (m :: * -> *). a -> Stream m a
fromPure a
y)
yield :: a -> Stream m a -> m r
yield a
y Stream m a
ry = do
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a -> Stream m a -> Stream m a
goX0 a
x Stream m a
ry)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (a
y forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
ry)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
my
goX :: a -> Stream m a -> Stream m a -> Stream m a
goX a
x Stream m a
mx Stream m a
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
_ m r
_ -> do
let stop :: m r
stop = a -> Stream m a -> m r
yld a
x Stream m a
mx
single :: a -> m r
single a
y = do
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a
x forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
mx)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (forall {m :: * -> *}. Stream m a -> a -> Stream m a
goY0 Stream m a
mx a
y)
yield :: a -> Stream m a -> m r
yield a
y Stream m a
ry = do
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a -> Stream m a -> Stream m a -> Stream m a
goX a
x Stream m a
mx Stream m a
ry)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (Stream m a -> a -> Stream m a -> Stream m a
goY Stream m a
mx a
y Stream m a
ry)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
my
goY0 :: Stream m a -> a -> Stream m a
goY0 Stream m a
mx a
y = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
_ -> do
let stop :: m r
stop = a -> m r
sng a
y
single :: a -> m r
single a
x = do
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (forall a (m :: * -> *). a -> Stream m a
fromPure a
x)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (forall a (m :: * -> *). a -> Stream m a
fromPure a
y)
yield :: a -> Stream m a -> m r
yield a
x Stream m a
rx = do
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a
x forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
rx)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (Stream m a -> a -> Stream m a
goY0 Stream m a
rx a
y)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
mx
goY :: Stream m a -> a -> Stream m a -> Stream m a
goY Stream m a
mx a
y Stream m a
my = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
_ m r
_ -> do
let stop :: m r
stop = a -> Stream m a -> m r
yld a
y Stream m a
my
single :: a -> m r
single a
x = do
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (forall {m :: * -> *}. a -> Stream m a -> Stream m a
goX0 a
x Stream m a
my)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (a
y forall a (m :: * -> *). a -> Stream m a -> Stream m a
`cons` Stream m a
my)
yield :: a -> Stream m a -> m r
yield a
x Stream m a
rx = do
case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> Stream m a -> m r
yld a
y (a -> Stream m a -> Stream m a -> Stream m a
goX a
x Stream m a
rx Stream m a
my)
Ordering
_ -> a -> Stream m a -> m r
yld a
x (Stream m a -> a -> Stream m a -> Stream m a
goY Stream m a
rx a
y Stream m a
my)
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yield a -> m r
single m r
stop Stream m a
mx
{-# INLINE the #-}
the :: (Eq a, Monad m) => Stream m a -> m (Maybe a)
the :: forall a (m :: * -> *).
(Eq a, Monad m) =>
Stream m a -> m (Maybe a)
the Stream m a
m = do
Maybe (a, Stream m a)
r <- forall (m :: * -> *) a.
Applicative m =>
Stream m a -> m (Maybe (a, Stream m a))
uncons Stream m a
m
case Maybe (a, Stream m a)
r of
Maybe (a, Stream m a)
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Just (a
h, Stream m a
t) -> forall {m :: * -> *} {a}.
(Monad m, Eq a) =>
a -> Stream m a -> m (Maybe a)
go a
h Stream m a
t
where
go :: a -> Stream m a -> m (Maybe a)
go a
h Stream m a
m1 =
let single :: a -> m (Maybe a)
single a
a | a
h forall a. Eq a => a -> a -> Bool
== a
a = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
h
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
yieldk :: a -> Stream m a -> m (Maybe a)
yieldk a
a Stream m a
r | a
h forall a. Eq a => a -> a -> Bool
== a
a = a -> Stream m a -> m (Maybe a)
go a
h Stream m a
r
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. State t m a
defState a -> Stream m a -> m (Maybe a)
yieldk forall {m :: * -> *}. Monad m => a -> m (Maybe a)
single (forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just a
h) Stream m a
m1
_alt :: Stream m a -> Stream m a -> Stream m a
_alt :: forall (m :: * -> *) a. Stream m a -> Stream m a -> Stream m a
_alt Stream m a
m1 Stream m a
m2 = forall (m :: * -> *) a.
(forall r.
State Stream m a
-> (a -> Stream m a -> m r) -> (a -> m r) -> m r -> m r)
-> Stream m a
mkStream forall a b. (a -> b) -> a -> b
$ \State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp ->
let stop :: m r
stop = forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stp Stream m a
m2
in forall (m :: * -> *) a r.
State Stream m a
-> (a -> Stream m a -> m r)
-> (a -> m r)
-> m r
-> Stream m a
-> m r
foldStream State Stream m a
st a -> Stream m a -> m r
yld a -> m r
sng m r
stop Stream m a
m1