@@ -6,6 +6,7 @@
6{-# LANGUAGE InstanceSigs #-}
6{-# LANGUAGE InstanceSigs #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
8{-# LANGUAGE RankNTypes #-}
8{-# LANGUAGE RankNTypes #-}
9+{-# LANGUAGE ScopedTypeVariables #-}
9{-# LANGUAGE UndecidableInstances #-} -- XXX
10{-# LANGUAGE UndecidableInstances #-} -- XXX
@@ -33,17 +34,21 @@ module Streamly.Streams.StreamK
34 -- * The stream type
35 -- * The stream type
41− -- * Construction
38+ -- * Construction Primitives
42 , mkStream
39 , mkStream
44+ -- * Elimination Primitives
49+ -- * Transformation Primitives
47 -- * Asynchronous construction
52 -- * Asynchronous construction
@@ -71,7 +76,6 @@ module Streamly.Streams.StreamK
72 -- * Elimination
77 -- * Elimination
73 -- ** General Folds
78 -- ** General Folds
@@ -174,9 +178,9 @@ import Streamly.Streams.StreamKType
175-- | Detach a stream from an SVar
179-- | Detach a stream from an SVar
176{-# INLINE unShare #-}
180{-# INLINE unShare #-}
177−unShare :: Stream m a -> Stream m a
181+unShare :: IsStream t => t m a -> t m a
178unShare x = mkStream $ \st stp sng yld ->
182unShare x = mkStream $ \st stp sng yld ->
179− unStream x st stp sng yld
183+ foldStream st stp sng yld x
181------------------------------------------------------------------------------
185------------------------------------------------------------------------------
182-- Construction
186-- Construction
@@ -197,7 +201,7 @@ infixr 5 `cons`
198-- @since 0.1.0
202-- @since 0.1.0
199cons :: IsStream t => a -> t m a -> t m a
203cons :: IsStream t => a -> t m a -> t m a
200−cons a r = fromStream $ mkStream $ \_ _ _ yld -> yld a (toStream r)
204+cons a r = mkStream $ \_ _ _ yld -> yld a r
202infixr 5 .:
206infixr 5 .:
@@ -218,15 +222,15 @@ infixr 5 .:
219-- | Make an empty stream from a callback function.
223-- | Make an empty stream from a callback function.
220nilK :: IsStream t => (forall r. m r -> m r) -> t m a
224nilK :: IsStream t => (forall r. m r -> m r) -> t m a
221−nilK k = fromStream $ mkStream $ \_ stp _ _ -> k stp
225+nilK k = mkStream $ \_ stp _ _ -> k stp
223-- | Make a singleton stream from a one shot callback function.
227-- | Make a singleton stream from a one shot callback function.
224yieldK :: IsStream t => (forall r. (a -> m r) -> m r) -> t m a
228yieldK :: IsStream t => (forall r. (a -> m r) -> m r) -> t m a
225−yieldK k = fromStream $ mkStream $ \_ _ sng _ -> k sng
229+yieldK k = mkStream $ \_ _ sng _ -> k sng
227-- | Construct a stream from a callback function.
231-- | Construct a stream from a callback function.
228consK :: IsStream t => (forall r. (a -> m r) -> m r) -> t m a -> t m a
232consK :: IsStream t => (forall r. (a -> m r) -> m r) -> t m a -> t m a
229−consK k r = fromStream $ mkStream $ \_ _ _ yld -> k (\x -> yld x (toStream r))
233+consK k r = mkStream $ \_ _ _ yld -> k (\x -> yld x r)
231-- XXX consK with concurrent callbacks
235-- XXX consK with concurrent callbacks
232-- XXX Build a stream from a repeating callback function.
236-- XXX Build a stream from a repeating callback function.
@@ -240,8 +244,8 @@ uncons :: (IsStream t, Monad m) => t m a -> m (Maybe (a, t m a))
240uncons m =
244uncons m =
241 let stop = return Nothing
245 let stop = return Nothing
242 single a = return (Just (a, nil))
246 single a = return (Just (a, nil))
243− yieldk a r = return (Just (a, fromStream r))
247+ yieldk a r = return (Just (a, r))
244− in unStream (toStream m) defState stop single yieldk
248+ in foldStream defState stop single yieldk m
246-------------------------------------------------------------------------------
250-------------------------------------------------------------------------------
247-- Generation
251-- Generation
@@ -249,7 +253,7 @@ uncons m =
250{-# INLINE unfoldr #-}
254{-# INLINE unfoldr #-}
251unfoldr :: IsStream t => (b -> Maybe (a, b)) -> b -> t m a
255unfoldr :: IsStream t => (b -> Maybe (a, b)) -> b -> t m a
252−unfoldr step = fromStream . go
256+unfoldr step = go
254 go s = mkStream $ \_ stp _ yld ->
258 go s = mkStream $ \_ stp _ yld ->
255 case step s of
259 case step s of
@@ -260,19 +264,19 @@ unfoldr step = fromStream . go
260unfoldrM :: (IsStream t, MonadAsync m) => (b -> m (Maybe (a, b))) -> b -> t m a
264unfoldrM :: (IsStream t, MonadAsync m) => (b -> m (Maybe (a, b))) -> b -> t m a
261unfoldrM step = go
265unfoldrM step = go
263− go s = fromStream $ mkStream $ \svr stp sng yld -> do
267+ go s = mkStream $ \st stp sng yld -> do
264 mayb <- step s
268 mayb <- step s
265 case mayb of
269 case mayb of
266 Nothing -> stp
270 Nothing -> stp
267 Just (a, b) ->
271 Just (a, b) ->
268− unStreamShared (toStream (return a |: go b)) svr stp sng yld
272+ foldStreamShared st stp sng yld $ return a |: go b
270-------------------------------------------------------------------------------
274-------------------------------------------------------------------------------
271-- Special generation
275-- Special generation
272-------------------------------------------------------------------------------
276-------------------------------------------------------------------------------
274yield :: IsStream t => a -> t m a
278yield :: IsStream t => a -> t m a
275−yield a = fromStream $ mkStream $ \_ _ single _ -> single a
279+yield a = mkStream $ \_ _ single _ -> single a
277-- | Same as yieldM
281-- | Same as yieldM
@@ -325,8 +329,8 @@ fromList :: IsStream t => [a] -> t m a
325fromList = fromFoldable
329fromList = fromFoldable
327{-# INLINE fromStreamK #-}
331{-# INLINE fromStreamK #-}
328−fromStreamK :: Stream m a -> Stream m a
332+fromStreamK :: IsStream t => Stream m a -> t m a
329−fromStreamK = id
333+fromStreamK = fromStream
331-------------------------------------------------------------------------------
335-------------------------------------------------------------------------------
332-- Elimination by Folding
336-- Elimination by Folding
@@ -334,24 +338,24 @@ fromStreamK = id
335-- | Lazy right associative fold.
339-- | Lazy right associative fold.
336foldr :: (IsStream t, Monad m) => (a -> b -> b) -> b -> t m a -> m b
340foldr :: (IsStream t, Monad m) => (a -> b -> b) -> b -> t m a -> m b
337−foldr step acc m = go (toStream m)
341+foldr step acc m = go m
340 let stop = return acc
344 let stop = return acc
341 single a = return (step a acc)
345 single a = return (step a acc)
342 yieldk a r = go r >>= \b -> return (step a b)
346 yieldk a r = go r >>= \b -> return (step a b)
343− in unStream m1 defState stop single yieldk
347+ in foldStream defState stop single yieldk m1
345-- | Lazy right fold with a monadic step function.
349-- | Lazy right fold with a monadic step function.
346{-# INLINE foldrM #-}
350{-# INLINE foldrM #-}
347foldrM :: (IsStream t, Monad m) => (a -> b -> m b) -> b -> t m a -> m b
351foldrM :: (IsStream t, Monad m) => (a -> b -> m b) -> b -> t m a -> m b
348−foldrM step acc m = go (toStream m)
352+foldrM step acc m = go m
351 let stop = return acc
355 let stop = return acc
352 single a = step a acc
356 single a = step a acc
353 yieldk a r = go r >>= step a
357 yieldk a r = go r >>= step a
354− in unStream m1 defState stop single yieldk
358+ in foldStream defState stop single yieldk m1
356{-# INLINE foldr1 #-}
360{-# INLINE foldr1 #-}
357foldr1 :: (IsStream t, Monad m) => (a -> a -> a) -> t m a -> m (Maybe a)
361foldr1 :: (IsStream t, Monad m) => (a -> a -> a) -> t m a -> m (Maybe a)
@@ -359,13 +363,13 @@ foldr1 step m = do
359 r <- uncons m
363 r <- uncons m
360 case r of
364 case r of
361 Nothing -> return Nothing
365 Nothing -> return Nothing
362− Just (h, t) -> fmap Just (go h (toStream t))
366+ Just (h, t) -> fmap Just (go h t)
364 go p m1 =
368 go p m1 =
365 let stp = return p
369 let stp = return p
366 single a = return $ step a p
370 single a = return $ step a p
367 yieldk a r = fmap (step p) (go a r)
371 yieldk a r = fmap (step p) (go a r)
368− in unStream m1 defState stp single yieldk
372+ in foldStream defState stp single yieldk m1
370-- | Strict left fold with an extraction function. Like the standard strict
374-- | Strict left fold with an extraction function. Like the standard strict
371-- left fold, but applies a user supplied extraction function (the third
375-- left fold, but applies a user supplied extraction function (the third
@@ -374,28 +378,31 @@ foldr1 step m = do
375-- Note that the accumulator is always evaluated including the initial value.
379-- Note that the accumulator is always evaluated including the initial value.
376{-# INLINE foldx #-}
380{-# INLINE foldx #-}
377−foldx :: (IsStream t, Monad m)
381+foldx :: forall t m a b x. (IsStream t, Monad m)
378 => (x -> a -> x) -> x -> (x -> b) -> t m a -> m b
382 => (x -> a -> x) -> x -> (x -> b) -> t m a -> m b
379−foldx step begin done m = get $ go (toStream m) begin
383+foldx step begin done m = get $ go m begin
381 {-# NOINLINE get #-}
385 {-# NOINLINE get #-}
383 -- XXX we are not strictly evaluating the accumulator here. Is this
388 -- XXX we are not strictly evaluating the accumulator here. Is this
385 let single = return . done
390 let single = return . done
391+ -- XXX this is foldSingleton. why foldStreamShared?
386− in unStreamShared m1 undefined undefined single undefined
392+ in foldStreamShared undefined undefined single undefined m1
388 -- Note, this can be implemented by making a recursive call to "go",
394 -- Note, this can be implemented by making a recursive call to "go",
389 -- however that is more expensive because of unnecessary recursion
395 -- however that is more expensive because of unnecessary recursion
390 -- that cannot be tail call optimized. Unfolding recursion explicitly via
396 -- that cannot be tail call optimized. Unfolding recursion explicitly via
391 -- continuations is much more efficient.
397 -- continuations is much more efficient.
398+ go :: t m a -> x -> t m x
392 go m1 !acc = mkStream $ \_ _ sng yld ->
399 go m1 !acc = mkStream $ \_ _ sng yld ->
393 let stop = sng acc
400 let stop = sng acc
394 single a = sng $ step acc a
401 single a = sng $ step acc a
395− yieldk a r =
402+ -- XXX this is foldNonEmptyStream
403+ yieldk a r = foldStream defState undefined sng yld $
396− let stream = go r (step acc a)
404+ go r (step acc a)
397− in unStream stream defState undefined sng yld
398− in unStream m1 defState stop single yieldk
405+ in foldStream defState stop single yieldk m1
400-- | Strict left associative fold.
407-- | Strict left associative fold.
401{-# INLINE foldl' #-}
408{-# INLINE foldl' #-}
@@ -406,13 +413,13 @@ foldl' step begin = foldx step begin id
406-- | Like 'foldx', but with a monadic step function.
413-- | Like 'foldx', but with a monadic step function.
407foldxM :: (IsStream t, Monad m)
414foldxM :: (IsStream t, Monad m)
408 => (x -> a -> m x) -> m x -> (x -> m b) -> t m a -> m b
415 => (x -> a -> m x) -> m x -> (x -> m b) -> t m a -> m b
409−foldxM step begin done m = go begin (toStream m)
416+foldxM step begin done m = go begin m
411 go !acc m1 =
418 go !acc m1 =
412 let stop = acc >>= done
419 let stop = acc >>= done
413 single a = acc >>= \b -> step b a >>= done
420 single a = acc >>= \b -> step b a >>= done
414 yieldk a r = acc >>= \b -> step b a >>= \x -> go (return x) r
421 yieldk a r = acc >>= \b -> step b a >>= \x -> go (return x) r
415− in unStream m1 defState stop single yieldk
422+ in foldStream defState stop single yieldk m1
417-- | Like 'foldl'' but with a monadic step function.
424-- | Like 'foldl'' but with a monadic step function.
418foldlM' :: (IsStream t, Monad m) => (b -> a -> m b) -> b -> t m a -> m b
425foldlM' :: (IsStream t, Monad m) => (b -> a -> m b) -> b -> t m a -> m b
@@ -424,13 +431,13 @@ foldlM' step begin = foldxM step (return begin) return
425{-# INLINE runStream #-}
432{-# INLINE runStream #-}
426runStream :: (Monad m, IsStream t) => t m a -> m ()
433runStream :: (Monad m, IsStream t) => t m a -> m ()
427−runStream m = go (toStream m)
434+runStream = go
430 let stop = return ()
437 let stop = return ()
431 single _ = return ()
438 single _ = return ()
432− yieldk _ r = go (toStream r)
439+ yieldk _ r = go r
433− in unStream m1 defState stop single yieldk
440+ in foldStream defState stop single yieldk m1
435{-# INLINE null #-}
442{-# INLINE null #-}
436null :: (IsStream t, Monad m) => t m a -> m Bool
443null :: (IsStream t, Monad m) => t m a -> m Bool
@@ -438,7 +445,7 @@ null m =
438 let stop = return True
445 let stop = return True
439 single _ = return False
446 single _ = return False
440 yieldk _ _ = return False
447 yieldk _ _ = return False
441− in unStream (toStream m) defState stop single yieldk
448+ in foldStream defState stop single yieldk m
443{-# INLINE head #-}
450{-# INLINE head #-}
444head :: (IsStream t, Monad m) => t m a -> m (Maybe a)
451head :: (IsStream t, Monad m) => t m a -> m (Maybe a)
@@ -446,69 +453,69 @@ head m =
446 let stop = return Nothing
453 let stop = return Nothing
447 single a = return (Just a)
454 single a = return (Just a)
448 yieldk a _ = return (Just a)
455 yieldk a _ = return (Just a)
449− in unStream (toStream m) defState stop single yieldk
456+ in foldStream defState stop single yieldk m
451{-# INLINE tail #-}
458{-# INLINE tail #-}
452tail :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
459tail :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
454 let stop = return Nothing
461 let stop = return Nothing
455 single _ = return $ Just nil
462 single _ = return $ Just nil
456− yieldk _ r = return $ Just $ fromStream r
463+ yieldk _ r = return $ Just r
457− in unStream (toStream m) defState stop single yieldk
464+ in foldStream defState stop single yieldk m
459{-# INLINE init #-}
466{-# INLINE init #-}
460init :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
467init :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
461−init m = go1 (toStream m)
468+init m = go1 m
463 go1 m1 = do
470 go1 m1 = do
464 r <- uncons m1
471 r <- uncons m1
465 case r of
472 case r of
466 Nothing -> return Nothing
473 Nothing -> return Nothing
467− Just (h, t) -> return . Just . fromStream $ go h t
474+ Just (h, t) -> return . Just $ go h t
468 go p m1 = mkStream $ \_ stp sng yld ->
475 go p m1 = mkStream $ \_ stp sng yld ->
469 let single _ = sng p
476 let single _ = sng p
470 yieldk a x = yld p $ go a x
477 yieldk a x = yld p $ go a x
471− in unStream m1 defState stp single yieldk
478+ in foldStream defState stp single yieldk m1
473{-# INLINE elem #-}
480{-# INLINE elem #-}
474elem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
481elem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
475−elem e m = go (toStream m)
482+elem e m = go m
478 let stop = return False
485 let stop = return False
479 single a = return (a == e)
486 single a = return (a == e)
480 yieldk a r = if a == e then return True else go r
487 yieldk a r = if a == e then return True else go r
481− in unStream m1 defState stop single yieldk
488+ in foldStream defState stop single yieldk m1
483{-# INLINE notElem #-}
490{-# INLINE notElem #-}
484notElem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
491notElem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
485−notElem e m = go (toStream m)
492+notElem e m = go m
488 let stop = return True
495 let stop = return True
489 single a = return (a /= e)
496 single a = return (a /= e)
490 yieldk a r = if a == e then return False else go r
497 yieldk a r = if a == e then return False else go r
491− in unStream m1 defState stop single yieldk
498+ in foldStream defState stop single yieldk m1
493all :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m Bool
500all :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m Bool
494−all p m = go (toStream m)
501+all p m = go m
497 let single a | p a = return True
504 let single a | p a = return True
498 | otherwise = return False
505 | otherwise = return False
499 yieldk a r | p a = go r
506 yieldk a r | p a = go r
500 | otherwise = return False
507 | otherwise = return False
501− in unStream m1 defState (return True) single yieldk
508+ in foldStream defState (return True) single yieldk m1
503any :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m Bool
510any :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m Bool
504−any p m = go (toStream m)
511+any p m = go m
507 let single a | p a = return True
514 let single a | p a = return True
508 | otherwise = return False
515 | otherwise = return False
509 yieldk a r | p a = return True
516 yieldk a r | p a = return True
510 | otherwise = go r
517 | otherwise = go r
511− in unStream m1 defState (return False) single yieldk
518+ in foldStream defState (return False) single yieldk m1
513-- | Extract the last element of the stream, if any.
520-- | Extract the last element of the stream, if any.
514{-# INLINE last #-}
521{-# INLINE last #-}
@@ -517,13 +524,13 @@ last = foldx (\_ y -> Just y) Nothing id
518{-# INLINE minimum #-}
525{-# INLINE minimum #-}
519minimum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
526minimum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
520−minimum m = go Nothing (toStream m)
527+minimum m = go Nothing m
522 go Nothing m1 =
529 go Nothing m1 =
523 let stop = return Nothing
530 let stop = return Nothing
524 single a = return (Just a)
531 single a = return (Just a)
525 yieldk a r = go (Just a) r
532 yieldk a r = go (Just a) r
526− in unStream m1 defState stop single yieldk
533+ in foldStream defState stop single yieldk m1
528 go (Just res) m1 =
535 go (Just res) m1 =
529 let stop = return (Just res)
536 let stop = return (Just res)
@@ -535,19 +542,19 @@ minimum m = go Nothing (toStream m)
535 if res <= a
542 if res <= a
536 then go (Just res) r
543 then go (Just res) r
537 else go (Just a) r
544 else go (Just a) r
538− in unStream m1 defState stop single yieldk
545+ in foldStream defState stop single yieldk m1
540{-# INLINE minimumBy #-}
547{-# INLINE minimumBy #-}
542 :: (IsStream t, Monad m)
549 :: (IsStream t, Monad m)
543 => (a -> a -> Ordering) -> t m a -> m (Maybe a)
550 => (a -> a -> Ordering) -> t m a -> m (Maybe a)
544−minimumBy cmp m = go Nothing (toStream m)
551+minimumBy cmp m = go Nothing m
546 go Nothing m1 =
553 go Nothing m1 =
547 let stop = return Nothing
554 let stop = return Nothing
548 single a = return (Just a)
555 single a = return (Just a)
549 yieldk a r = go (Just a) r
556 yieldk a r = go (Just a) r
550− in unStream m1 defState stop single yieldk
557+ in foldStream defState stop single yieldk m1
552 go (Just res) m1 =
559 go (Just res) m1 =
553 let stop = return (Just res)
560 let stop = return (Just res)
@@ -557,17 +564,17 @@ minimumBy cmp m = go Nothing (toStream m)
557 yieldk a r = case cmp res a of
564 yieldk a r = case cmp res a of
558 GT -> go (Just a) r
565 GT -> go (Just a) r
559 _ -> go (Just res) r
566 _ -> go (Just res) r
560− in unStream m1 defState stop single yieldk
567+ in foldStream defState stop single yieldk m1
562{-# INLINE maximum #-}
569{-# INLINE maximum #-}
563maximum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
570maximum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
564−maximum m = go Nothing (toStream m)
571+maximum m = go Nothing m
566 go Nothing m1 =
573 go Nothing m1 =
567 let stop = return Nothing
574 let stop = return Nothing
568 single a = return (Just a)
575 single a = return (Just a)
569 yieldk a r = go (Just a) r
576 yieldk a r = go (Just a) r
570− in unStream m1 defState stop single yieldk
577+ in foldStream defState stop single yieldk m1
572 go (Just res) m1 =
579 go (Just res) m1 =
573 let stop = return (Just res)
580 let stop = return (Just res)
@@ -579,17 +586,17 @@ maximum m = go Nothing (toStream m)
579 if res <= a
586 if res <= a
580 then go (Just a) r
587 then go (Just a) r
581 else go (Just res) r
588 else go (Just res) r
582− in unStream m1 defState stop single yieldk
589+ in foldStream defState stop single yieldk m1
584{-# INLINE maximumBy #-}
591{-# INLINE maximumBy #-}
585maximumBy :: (IsStream t, Monad m) => (a -> a -> Ordering) -> t m a -> m (Maybe a)
592maximumBy :: (IsStream t, Monad m) => (a -> a -> Ordering) -> t m a -> m (Maybe a)
586−maximumBy cmp m = go Nothing (toStream m)
593+maximumBy cmp m = go Nothing m
588 go Nothing m1 =
595 go Nothing m1 =
589 let stop = return Nothing
596 let stop = return Nothing
590 single a = return (Just a)
597 single a = return (Just a)
591 yieldk a r = go (Just a) r
598 yieldk a r = go (Just a) r
592− in unStream m1 defState stop single yieldk
599+ in foldStream defState stop single yieldk m1
594 go (Just res) m1 =
601 go (Just res) m1 =
595 let stop = return (Just res)
602 let stop = return (Just res)
@@ -599,11 +606,11 @@ maximumBy cmp m = go Nothing (toStream m)
599 yieldk a r = case cmp res a of
606 yieldk a r = case cmp res a of
600 GT -> go (Just res) r
607 GT -> go (Just res) r
601 _ -> go (Just a) r
608 _ -> go (Just a) r
602− in unStream m1 defState stop single yieldk
609+ in foldStream defState stop single yieldk m1
604{-# INLINE (!!) #-}
611{-# INLINE (!!) #-}
605(!!) :: (IsStream t, Monad m) => t m a -> Int -> m (Maybe a)
612(!!) :: (IsStream t, Monad m) => t m a -> Int -> m (Maybe a)
606−m !! i = go i (toStream m)
613+m !! i = go i m
608 go n m1 =
615 go n m1 =
609 let single a | n == 0 = return $ Just a
616 let single a | n == 0 = return $ Just a
@@ -611,22 +618,22 @@ m !! i = go i (toStream m)
611 yieldk a x | n < 0 = return Nothing
618 yieldk a x | n < 0 = return Nothing
612 | n == 0 = return $ Just a
619 | n == 0 = return $ Just a
613 | otherwise = go (n - 1) x
620 | otherwise = go (n - 1) x
614− in unStream m1 defState (return Nothing) single yieldk
621+ in foldStream defState (return Nothing) single yieldk m1
616{-# INLINE lookup #-}
623{-# INLINE lookup #-}
617lookup :: (IsStream t, Monad m, Eq a) => a -> t m (a, b) -> m (Maybe b)
624lookup :: (IsStream t, Monad m, Eq a) => a -> t m (a, b) -> m (Maybe b)
618−lookup e m = go (toStream m)
625+lookup e m = go m
621 let single (a, b) | a == e = return $ Just b
628 let single (a, b) | a == e = return $ Just b
622 | otherwise = return Nothing
629 | otherwise = return Nothing
623 yieldk (a, b) x | a == e = return $ Just b
630 yieldk (a, b) x | a == e = return $ Just b
624 | otherwise = go x
631 | otherwise = go x
625− in unStream m1 defState (return Nothing) single yieldk
632+ in foldStream defState (return Nothing) single yieldk m1
627{-# INLINE findM #-}
634{-# INLINE findM #-}
628findM :: (IsStream t, Monad m) => (a -> m Bool) -> t m a -> m (Maybe a)
635findM :: (IsStream t, Monad m) => (a -> m Bool) -> t m a -> m (Maybe a)
629−findM p m = go (toStream m)
636+findM p m = go m
632 let single a = do
639 let single a = do
@@ -635,7 +642,7 @@ findM p m = go (toStream m)
635 yieldk a x = do
642 yieldk a x = do
637 if b then return $ Just a else go x
644 if b then return $ Just a else go x
638− in unStream m1 defState (return Nothing) single yieldk
645+ in foldStream defState (return Nothing) single yieldk m1
640{-# INLINE find #-}
647{-# INLINE find #-}
641find :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m (Maybe a)
648find :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m (Maybe a)
@@ -643,14 +650,15 @@ find p = findM (return . p)
644{-# INLINE findIndices #-}
651{-# INLINE findIndices #-}
645findIndices :: IsStream t => (a -> Bool) -> t m a -> t m Int
652findIndices :: IsStream t => (a -> Bool) -> t m a -> t m Int
646−findIndices p = fromStream . go 0 . toStream
653+findIndices p = go 0
648 go offset m1 = mkStream $ \st stp sng yld ->
655 go offset m1 = mkStream $ \st stp sng yld ->
649 let single a | p a = sng offset
656 let single a | p a = sng offset
650 | otherwise = stp
657 | otherwise = stp
651 yieldk a x | p a = yld offset $ go (offset + 1) x
658 yieldk a x | p a = yld offset $ go (offset + 1) x
659+ | otherwise = foldStream (adaptState st) stp sng yld $
652− | otherwise = unStream (go (offset + 1) x) st stp sng yld
660+ go (offset + 1) x
653− in unStream m1 st stp single yieldk
661+ in foldStream (adaptState st) stp single yieldk m1
655------------------------------------------------------------------------------
663------------------------------------------------------------------------------
656-- Map and Fold
664-- Map and Fold
@@ -659,13 +667,13 @@ findIndices p = fromStream . go 0 . toStream
659-- | Apply a monadic action to each element of the stream and discard the
667-- | Apply a monadic action to each element of the stream and discard the
660-- output of the action.
668-- output of the action.
661mapM_ :: (IsStream t, Monad m) => (a -> m b) -> t m a -> m ()
669mapM_ :: (IsStream t, Monad m) => (a -> m b) -> t m a -> m ()
662−mapM_ f m = go (toStream m)
670+mapM_ f m = go m
665 let stop = return ()
673 let stop = return ()
666 single a = void (f a)
674 single a = void (f a)
667 yieldk a r = f a >> go r
675 yieldk a r = f a >> go r
668− in unStream m1 defState stop single yieldk
676+ in foldStream defState stop single yieldk m1
670------------------------------------------------------------------------------
678------------------------------------------------------------------------------
671-- Converting folds
679-- Converting folds
@@ -686,14 +694,14 @@ toStreamK = id
686{-# INLINE scanx #-}
694{-# INLINE scanx #-}
687scanx :: IsStream t => (x -> a -> x) -> x -> (x -> b) -> t m a -> t m b
695scanx :: IsStream t => (x -> a -> x) -> x -> (x -> b) -> t m a -> t m b
688scanx step begin done m =
696scanx step begin done m =
689− cons (done begin) $ fromStream $ go (toStream m) begin
697+ cons (done begin) $ go m begin
691 go m1 !acc = mkStream $ \st stp sng yld ->
699 go m1 !acc = mkStream $ \st stp sng yld ->
692 let single a = sng (done $ step acc a)
700 let single a = sng (done $ step acc a)
693 yieldk a r =
701 yieldk a r =
694 let s = step acc a
702 let s = step acc a
695 in yld (done s) (go r s)
703 in yld (done s) (go r s)
696− in unStream m1 st stp single yieldk
704+ in foldStream (adaptState st) stp single yieldk m1
698{-# INLINE scanl' #-}
706{-# INLINE scanl' #-}
699scanl' :: IsStream t => (b -> a -> b) -> b -> t m a -> t m b
707scanl' :: IsStream t => (b -> a -> b) -> b -> t m a -> t m b
@@ -705,58 +713,58 @@ scanl' step begin = scanx step begin id
706{-# INLINE filter #-}
714{-# INLINE filter #-}
707filter :: IsStream t => (a -> Bool) -> t m a -> t m a
715filter :: IsStream t => (a -> Bool) -> t m a -> t m a
708−filter p m = fromStream $ go (toStream m)
716+filter p m = go m
710 go m1 = mkStream $ \st stp sng yld ->
718 go m1 = mkStream $ \st stp sng yld ->
711 let single a | p a = sng a
719 let single a | p a = sng a
712 | otherwise = stp
720 | otherwise = stp
713 yieldk a r | p a = yld a (go r)
721 yieldk a r | p a = yld a (go r)
714− | otherwise = unStream r st stp single yieldk
722+ | otherwise = foldStream st stp single yieldk r
715− in unStream m1 st stp single yieldk
723+ in foldStream st stp single yieldk m1
717{-# INLINE take #-}
725{-# INLINE take #-}
718take :: IsStream t => Int -> t m a -> t m a
726take :: IsStream t => Int -> t m a -> t m a
719−take n m = fromStream $ go n (toStream m)
727+take n m = go n m
721 go n1 m1 = mkStream $ \st stp sng yld ->
729 go n1 m1 = mkStream $ \st stp sng yld ->
722 let yieldk a r = yld a (go (n1 - 1) r)
730 let yieldk a r = yld a (go (n1 - 1) r)
723 in if n1 <= 0
731 in if n1 <= 0
725− else unStream m1 st stp sng yieldk
733+ else foldStream st stp sng yieldk m1
727{-# INLINE takeWhile #-}
735{-# INLINE takeWhile #-}
728takeWhile :: IsStream t => (a -> Bool) -> t m a -> t m a
736takeWhile :: IsStream t => (a -> Bool) -> t m a -> t m a
729−takeWhile p m = fromStream $ go (toStream m)
737+takeWhile p m = go m
731 go m1 = mkStream $ \st stp sng yld ->
739 go m1 = mkStream $ \st stp sng yld ->
732 let single a | p a = sng a
740 let single a | p a = sng a
733 | otherwise = stp
741 | otherwise = stp
734 yieldk a r | p a = yld a (go r)
742 yieldk a r | p a = yld a (go r)
735 | otherwise = stp
743 | otherwise = stp
736− in unStream m1 st stp single yieldk
744+ in foldStream st stp single yieldk m1
738drop :: IsStream t => Int -> t m a -> t m a
746drop :: IsStream t => Int -> t m a -> t m a
739−drop n m = fromStream $ mkStream $ \st stp sng yld ->
747+drop n m = mkStream $ \st stp sng yld ->
740− unStream (go n (toStream m)) st stp sng yld
748+ foldStream st stp sng yld $ go n m
742 go n1 m1 = mkStream $ \st stp sng yld ->
750 go n1 m1 = mkStream $ \st stp sng yld ->
743 let single _ = stp
751 let single _ = stp
744− yieldk _ r = (unStream $ go (n1 - 1) r) st stp sng yld
752+ yieldk _ r = foldStream st stp sng yld $ go (n1 - 1) r
745 -- Somehow "<=" check performs better than a ">"
753 -- Somehow "<=" check performs better than a ">"
746 in if n1 <= 0
754 in if n1 <= 0
747− then unStream m1 st stp sng yld
755+ then foldStream st stp sng yld m1
748− else unStream m1 st stp single yieldk
756+ else foldStream st stp single yieldk m1
750{-# INLINE dropWhile #-}
758{-# INLINE dropWhile #-}
751dropWhile :: IsStream t => (a -> Bool) -> t m a -> t m a
759dropWhile :: IsStream t => (a -> Bool) -> t m a -> t m a
752−dropWhile p m = fromStream $ go (toStream m)
760+dropWhile p m = go m
754 go m1 = mkStream $ \st stp sng yld ->
762 go m1 = mkStream $ \st stp sng yld ->
755 let single a | p a = stp
763 let single a | p a = stp
756 | otherwise = sng a
764 | otherwise = sng a
757− yieldk a r | p a = unStream r st stp single yieldk
765+ yieldk a r | p a = foldStream st stp single yieldk r
758 | otherwise = yld a r
766 | otherwise = yld a r
759− in unStream m1 st stp single yieldk
767+ in foldStream st stp single yieldk m1
761-------------------------------------------------------------------------------
769-------------------------------------------------------------------------------
762-- Mapping
770-- Mapping
@@ -766,23 +774,23 @@ dropWhile p m = fromStream $ go (toStream m)
766-- other stream types to overload it.
774-- other stream types to overload it.
767{-# INLINE mapM #-}
775{-# INLINE mapM #-}
768mapM :: (IsStream t, MonadAsync m) => (a -> m b) -> t m a -> t m b
776mapM :: (IsStream t, MonadAsync m) => (a -> m b) -> t m a -> t m b
769−mapM f m = go (toStream m)
777+mapM f m = go m
771− go m1 = fromStream $ mkStream $ \st stp sng yld ->
779+ go m1 = mkStream $ \st stp sng yld ->
772 let single a = f a >>= sng
780 let single a = f a >>= sng
773− yieldk a r = unStreamShared (toStream (f a |: go r)) st stp sng yld
781+ yieldk a r = foldStreamShared st stp sng yld $ f a |: go r
774− in unStream m1 st stp single yieldk
782+ in foldStream (adaptState st) stp single yieldk m1
776-- Be careful when modifying this, this uses a consM (|:) deliberately to allow
784-- Be careful when modifying this, this uses a consM (|:) deliberately to allow
777-- other stream types to overload it.
785-- other stream types to overload it.
778{-# INLINE sequence #-}
786{-# INLINE sequence #-}
779sequence :: (IsStream t, MonadAsync m) => t m (m a) -> t m a
787sequence :: (IsStream t, MonadAsync m) => t m (m a) -> t m a
780−sequence m = go (toStream m)
788+sequence m = go m
782− go m1 = fromStream $ mkStream $ \st stp sng yld ->
790+ go m1 = mkStream $ \st stp sng yld ->
783 let single ma = ma >>= sng
791 let single ma = ma >>= sng
784− yieldk ma r = unStreamShared (toStream $ ma |: go r) st stp sng yld
792+ yieldk ma r = foldStreamShared st stp sng yld $ ma |: go r
785− in unStream m1 st stp single yieldk
793+ in foldStream (adaptState st) stp single yieldk m1
787-------------------------------------------------------------------------------
795-------------------------------------------------------------------------------
788-- Inserting
796-- Inserting
@@ -790,19 +798,19 @@ sequence m = go (toStream m)
791{-# INLINE intersperseM #-}
799{-# INLINE intersperseM #-}
792intersperseM :: (IsStream t, MonadAsync m) => m a -> t m a -> t m a
800intersperseM :: (IsStream t, MonadAsync m) => m a -> t m a -> t m a
793−intersperseM a m = fromStream $ prependingStart (toStream m)
801+intersperseM a m = prependingStart m
795 prependingStart m1 = mkStream $ \st stp sng yld ->
803 prependingStart m1 = mkStream $ \st stp sng yld ->
796− let yieldk i x = unStreamShared (return i |: go x) st stp sng yld
804+ let yieldk i x = foldStreamShared st stp sng yld $ return i |: go x
797− in unStream m1 st stp sng yieldk
805+ in foldStream st stp sng yieldk m1
798− go m2 = fromStream $ mkStream $ \st stp sng yld ->
806+ go m2 = mkStream $ \st stp sng yld ->
799− let single i = unStreamShared (a |: yield i) st stp sng yld
807+ let single i = foldStreamShared st stp sng yld $ a |: yield i
800− yieldk i x = unStreamShared (a |: return i |: go x) st stp sng yld
808+ yieldk i x = foldStreamShared st stp sng yld $ a |: return i |: go x
801− in unStream m2 st stp single yieldk
809+ in foldStream st stp single yieldk m2
803{-# INLINE insertBy #-}
811{-# INLINE insertBy #-}
804insertBy :: IsStream t => (a -> a -> Ordering) -> a -> t m a -> t m a
812insertBy :: IsStream t => (a -> a -> Ordering) -> a -> t m a -> t m a
805−insertBy cmp x m = fromStream $ go (toStream m)
813+insertBy cmp x m = go m
807 go m1 = mkStream $ \st _ _ yld ->
815 go m1 = mkStream $ \st _ _ yld ->
808 let single a = case cmp x a of
816 let single a = case cmp x a of
@@ -812,7 +820,7 @@ insertBy cmp x m = fromStream $ go (toStream m)
812 yieldk a r = case cmp x a of
820 yieldk a r = case cmp x a of
813 GT -> yld a (go r)
821 GT -> yld a (go r)
814 _ -> yld x (a `cons` r)
822 _ -> yld x (a `cons` r)
815− in unStream m1 st stop single yieldk
823+ in foldStream st stop single yieldk m1
817------------------------------------------------------------------------------
825------------------------------------------------------------------------------
818-- Deleting
826-- Deleting
@@ -820,14 +828,14 @@ insertBy cmp x m = fromStream $ go (toStream m)
821{-# INLINE deleteBy #-}
829{-# INLINE deleteBy #-}
822deleteBy :: IsStream t => (a -> a -> Bool) -> a -> t m a -> t m a
830deleteBy :: IsStream t => (a -> a -> Bool) -> a -> t m a -> t m a
823−deleteBy eq x m = fromStream $ go (toStream m)
831+deleteBy eq x m = go m
825 go m1 = mkStream $ \st stp sng yld ->
833 go m1 = mkStream $ \st stp sng yld ->
826 let single a = if eq x a then stp else sng a
834 let single a = if eq x a then stp else sng a
827 yieldk a r = if eq x a
835 yieldk a r = if eq x a
828− then unStream r st stp sng yld
836+ then foldStream st stp sng yld r
829 else yld a (go r)
837 else yld a (go r)
830− in unStream m1 st stp single yieldk
838+ in foldStream st stp single yieldk m1
832-------------------------------------------------------------------------------
840-------------------------------------------------------------------------------
833-- Map and Filter
841-- Map and Filter
@@ -835,70 +843,66 @@ deleteBy eq x m = fromStream $ go (toStream m)
836{-# INLINE mapMaybe #-}
844{-# INLINE mapMaybe #-}
837mapMaybe :: IsStream t => (a -> Maybe b) -> t m a -> t m b
845mapMaybe :: IsStream t => (a -> Maybe b) -> t m a -> t m b
838−mapMaybe f m = go (toStream m)
846+mapMaybe f m = go m
840− go m1 = fromStream $ mkStream $ \st stp sng yld ->
848+ go m1 = mkStream $ \st stp sng yld ->
841 let single a = case f a of
849 let single a = case f a of
842 Just b -> sng b
850 Just b -> sng b
843 Nothing -> stp
851 Nothing -> stp
844 yieldk a r = case f a of
852 yieldk a r = case f a of
845− Just b -> yld b (toStream $ go r)
853+ Just b -> yld b $ go r
846− Nothing -> unStream r st stp single yieldk
854+ Nothing -> foldStream (adaptState st) stp single yieldk r
847− in unStream m1 st stp single yieldk
855+ in foldStream (adaptState st) stp single yieldk m1
849------------------------------------------------------------------------------
857------------------------------------------------------------------------------
850-- Serial Zipping
858-- Serial Zipping
851------------------------------------------------------------------------------
859------------------------------------------------------------------------------
853−{-# INLINE zipWithS #-}
861+-- | Zip two streams serially using a pure zipping function.
854−zipWithS :: (a -> b -> c) -> Stream m a -> Stream m b -> Stream m c
862+--
855−zipWithS f = go
863+-- @since 0.1.0
864+{-# INLINABLE zipWith #-}
865+zipWith :: IsStream t => (a -> b -> c) -> t m a -> t m b -> t m c
857 go mx my = mkStream $ \st stp sng yld -> do
868 go mx my = mkStream $ \st stp sng yld -> do
858 let merge a ra =
869 let merge a ra =
859 let single2 b = sng (f a b)
870 let single2 b = sng (f a b)
860 yield2 b rb = yld (f a b) (go ra rb)
871 yield2 b rb = yld (f a b) (go ra rb)
861− in unStream my st stp single2 yield2
872+ in foldStream (adaptState st) stp single2 yield2 my
862 let single1 a = merge a nil
873 let single1 a = merge a nil
863 yield1 = merge
874 yield1 = merge
864− unStream mx st stp single1 yield1
875+ foldStream (adaptState st) stp single1 yield1 mx
866−-- | Zip two streams serially using a pure zipping function.
869−{-# INLINABLE zipWith #-}
870−zipWith :: IsStream t => (a -> b -> c) -> t m a -> t m b -> t m c
871−zipWith f m1 m2 = fromStream $ zipWithS f (toStream m1) (toStream m2)
873-- | Zip two streams serially using a monadic zipping function.
877-- | Zip two streams serially using a monadic zipping function.
875-- @since 0.1.0
879-- @since 0.1.0
876zipWithM :: (IsStream t, Monad m) => (a -> b -> m c) -> t m a -> t m b -> t m c
880zipWithM :: (IsStream t, Monad m) => (a -> b -> m c) -> t m a -> t m b -> t m c
877−zipWithM f m1 m2 = fromStream $ go (toStream m1) (toStream m2)
881+zipWithM f m1 m2 = go m1 m2
879 go mx my = mkStream $ \st stp sng yld -> do
883 go mx my = mkStream $ \st stp sng yld -> do
880 let merge a ra =
884 let merge a ra =
881− let runIt x = unStream x st stp sng yld
885+ let runIt x = foldStream st stp sng yld x
882 single2 b = f a b >>= sng
886 single2 b = f a b >>= sng
883 yield2 b rb = f a b >>= \x -> runIt (x `cons` go ra rb)
887 yield2 b rb = f a b >>= \x -> runIt (x `cons` go ra rb)
884− in unStream my st stp single2 yield2
888+ in foldStream (adaptState st) stp single2 yield2 my
885 let single1 a = merge a nil
889 let single1 a = merge a nil
886 yield1 = merge
890 yield1 = merge
887− unStream mx st stp single1 yield1
891+ foldStream (adaptState st) stp single1 yield1 mx
889------------------------------------------------------------------------------
893------------------------------------------------------------------------------
890-- Merging
894-- Merging
891------------------------------------------------------------------------------
895------------------------------------------------------------------------------
893−{-# INLINE mergeByS #-}
897+{-# INLINE mergeByM #-}
895− :: Monad m
899+ :: (IsStream t, Monad m)
896− => (a -> a -> m Ordering) -> Stream m a -> Stream m a -> Stream m a
900+ => (a -> a -> m Ordering) -> t m a -> t m a -> t m a
897−mergeByS cmp = go
901+mergeByM cmp = go
899 go mx my = mkStream $ \st stp sng yld -> do
903 go mx my = mkStream $ \st stp sng yld -> do
900 let mergeWithY a ra =
904 let mergeWithY a ra =
901− let stop2 = unStream mx st stp sng yld
905+ let stop2 = foldStream st stp sng yld mx
902 single2 b = do
906 single2 b = do
903 r <- cmp a b
907 r <- cmp a b
904 case r of
908 case r of
@@ -909,17 +913,11 @@ mergeByS cmp = go
909 case r of
913 case r of
910 GT -> yld b (go (a `cons` ra) rb)
914 GT -> yld b (go (a `cons` ra) rb)
911 _ -> yld a (go ra (b `cons` rb))
915 _ -> yld a (go ra (b `cons` rb))
912− in unStream my st stop2 single2 yield2
916+ in foldStream st stop2 single2 yield2 my
913− let stopX = unStream my st stp sng yld
917+ let stopX = foldStream st stp sng yld my
914 singleX a = mergeWithY a nil
918 singleX a = mergeWithY a nil
915 yieldX = mergeWithY
919 yieldX = mergeWithY
916− unStream mx st stopX singleX yieldX
920+ foldStream st stopX singleX yieldX mx
918−{-# INLINABLE mergeByM #-}
920− :: (IsStream t, Monad m)
921− => (a -> a -> m Ordering) -> t m a -> t m a -> t m a
922−mergeByM f m1 m2 = fromStream $ mergeByS f (toStream m1) (toStream m2)
924{-# INLINABLE mergeBy #-}
922{-# INLINABLE mergeBy #-}
@@ -937,14 +935,14 @@ the m = do
937 r <- uncons m
935 r <- uncons m
938 case r of
936 case r of
939 Nothing -> return Nothing
937 Nothing -> return Nothing
940− Just (h, t) -> go h (toStream t)
938+ Just (h, t) -> go h t
942 go h m1 =
940 go h m1 =
943 let single a | h == a = return $ Just h
941 let single a | h == a = return $ Just h
944 | otherwise = return Nothing
942 | otherwise = return Nothing
945 yieldk a r | h == a = go h r
943 yieldk a r | h == a = go h r
946 | otherwise = return Nothing
944 | otherwise = return Nothing
947− in unStream m1 defState (return $ Just h) single yieldk
945+ in foldStream defState (return $ Just h) single yieldk m1
949-------------------------------------------------------------------------------
947-------------------------------------------------------------------------------
950-- Bind utility
948-- Bind utility
@@ -952,20 +950,19 @@ the m = do
953{-# INLINE bindWith #-}
951{-# INLINE bindWith #-}
955− :: (forall c. Stream m c -> Stream m c -> Stream m c)
954+ => (forall c. t m c -> t m c -> t m c)
956− -> Stream m a
955+ -> t m a
957− -> (a -> Stream m b)
956+ -> (a -> t m b)
958− -> Stream m b
957+ -> t m b
959bindWith par m1 f = go m1
958bindWith par m1 f = go m1
962 mkStream $ \st stp sng yld ->
961 mkStream $ \st stp sng yld ->
963− let runShared x = unStreamShared x st stp sng yld
962+ let foldShared = foldStreamShared st stp sng yld
964− runIsolated x = unStream x st stp sng yld
963+ single a = foldShared $ unShare (f a)
966− single a = runIsolated $ f a
967− yieldk a r = runShared $ unShare (f a) `par` go r
964+ yieldk a r = foldShared $ unShare (f a) `par` go r
968− in unStream m st stp single yieldk
965+ in foldStream (adaptState st) stp single yieldk m
970------------------------------------------------------------------------------
967------------------------------------------------------------------------------
971-- Alternative & MonadPlus
968-- Alternative & MonadPlus
@@ -973,8 +970,8 @@ bindWith par m1 f = go m1
974_alt :: Stream m a -> Stream m a -> Stream m a
971_alt :: Stream m a -> Stream m a -> Stream m a
975_alt m1 m2 = mkStream $ \st stp sng yld ->
972_alt m1 m2 = mkStream $ \st stp sng yld ->
976− let stop = unStream m2 st stp sng yld
973+ let stop = foldStream st stp sng yld m2
977− in unStream m1 st stop sng yld
974+ in foldStream st stop sng yld m1
979------------------------------------------------------------------------------
976------------------------------------------------------------------------------
980-- MonadReader
977-- MonadReader
@@ -985,7 +982,7 @@ withLocal f m =
985 mkStream $ \st stp sng yld ->
982 mkStream $ \st stp sng yld ->
986 let single = local f . sng
983 let single = local f . sng
987 yieldk a r = local f $ yld a (withLocal f r)
984 yieldk a r = local f $ yld a (withLocal f r)
988− in unStream m st (local f stp) single yieldk
985+ in foldStream st (local f stp) single yieldk m
990------------------------------------------------------------------------------
987------------------------------------------------------------------------------
991-- MonadError
988-- MonadError
@@ -1003,4 +1000,3 @@ withCatchError m h =
1003 yieldk a r = yld a (withCatchError r h)
1000 yieldk a r = yld a (withCatchError r h)
1004 in handle $ run m
1001 in handle $ run m