@@ -32,8 +32,8 @@ module Streamly.Streams.StreamK
34 -- * The stream type
34 -- * The stream type
35− , Stream (..)
35+ , Stream
36− , unStreamIsolated
36+ , unStream
37 , isolateStream
37 , isolateStream
38 , unStreamShared
38 , unStreamShared
39 , runStreamSVar
39 , runStreamSVar
@@ -196,32 +196,28 @@ import Streamly.SVar
196-- for Applicative and Monad, and in 'lift' for MonadTrans.
196-- for Applicative and Monad, and in 'lift' for MonadTrans.
198newtype Stream m a =
198newtype Stream m a =
199− Stream {
199+ Stream (forall r.
200− unStream :: forall r.
201 State Stream m a -- state
200 State Stream m a -- state
202 -> m r -- stop
201 -> m r -- stop
203 -> (a -> m r) -- singleton
202 -> (a -> m r) -- singleton
204 -> (a -> Stream m a -> m r) -- yield
203 -> (a -> Stream m a -> m r) -- yield
208−-- XXX make this the default "unStream"
207+{-# INLINE unStream #-}
209−-- | unwraps the Stream type producing the stream function that can be run with
208+unStream ::
211−{-# INLINE unStreamIsolated #-}
213 Stream m a
209 Stream m a
214− -> State Stream m a -- state
210+ -> State Stream m b -- state
215 -> m r -- stop
211 -> m r -- stop
216 -> (a -> m r) -- singleton
212 -> (a -> m r) -- singleton
217 -> (a -> Stream m a -> m r) -- yield
213 -> (a -> Stream m a -> m r) -- yield
219−unStreamIsolated x st = unStream x (rstState st)
215+unStream (Stream runner) st = runner (rstState st)
221{-# INLINE isolateStream #-}
217{-# INLINE isolateStream #-}
222isolateStream :: Stream m a -> Stream m a
218isolateStream :: Stream m a -> Stream m a
223isolateStream x = Stream $ \st stp sng yld ->
219isolateStream x = Stream $ \st stp sng yld ->
224− unStreamIsolated x st stp sng yld
220+ unStream x st stp sng yld
226-- | Like unstream, but passes a shared SVar across continuations.
222-- | Like unstream, but passes a shared SVar across continuations.
227{-# INLINE unStreamShared #-}
223{-# INLINE unStreamShared #-}
@@ -232,7 +228,7 @@ unStreamShared ::
232 -> (a -> m r) -- singleton
228 -> (a -> m r) -- singleton
233 -> (a -> Stream m a -> m r) -- yield
229 -> (a -> Stream m a -> m r) -- yield
235−unStreamShared = unStream
231+unStreamShared (Stream runner) st stp sng yld = runner st stp sng yld
237-- Run the stream using a run function associated with the SVar that runs the
233-- Run the stream using a run function associated with the SVar that runs the
238-- streams with a captured snapshot of the monadic state.
234-- streams with a captured snapshot of the monadic state.
@@ -248,7 +244,7 @@ runStreamSVar
249runStreamSVar sv m st stp sng yld =
245runStreamSVar sv m st stp sng yld =
250 let mrun = runInIO $ svarMrun sv
246 let mrun = runInIO $ svarMrun sv
251− in void $ liftIO $ mrun $ unStream m st stp sng yld
247+ in void $ liftIO $ mrun $ unStreamShared m st stp sng yld
253------------------------------------------------------------------------------
249------------------------------------------------------------------------------
254-- Types that can behave as a Stream
250-- Types that can behave as a Stream
@@ -332,7 +328,7 @@ mkStream:: IsStream t
333mkStream k = fromStream $ Stream $ \st stp sng yld ->
329mkStream k = fromStream $ Stream $ \st stp sng yld ->
334 let yieldk a r = yld a (toStream r)
330 let yieldk a r = yld a (toStream r)
335− in k (rstState st) stp sng yieldk
331+ in k st stp sng yieldk
337------------------------------------------------------------------------------
333------------------------------------------------------------------------------
338-- Construction
334-- Construction
@@ -430,7 +426,7 @@ uncons m =
430 let stop = return Nothing
426 let stop = return Nothing
431 single a = return (Just (a, nil))
427 single a = return (Just (a, nil))
432 yieldk a r = return (Just (a, fromStream r))
428 yieldk a r = return (Just (a, fromStream r))
433− in unStream (toStream m) defState stop single yieldk
429+ in unStreamShared (toStream m) defState stop single yieldk
435-------------------------------------------------------------------------------
431-------------------------------------------------------------------------------
436-- Generation
432-- Generation
@@ -454,7 +450,7 @@ unfoldrM step = go
454 case mayb of
450 case mayb of
455 Nothing -> stp
451 Nothing -> stp
456 Just (a, b) ->
452 Just (a, b) ->
457− unStream (toStream (return a |: go b)) svr stp sng yld
453+ unStreamShared (toStream (return a |: go b)) svr stp sng yld
459-------------------------------------------------------------------------------
455-------------------------------------------------------------------------------
460-- Special generation
456-- Special generation
@@ -537,7 +533,7 @@ foldStream
538foldStream st blank single step m =
534foldStream st blank single step m =
539 let yieldk a x = step a (fromStream x)
535 let yieldk a x = step a (fromStream x)
540− in unStream (toStream m) st blank single yieldk
536+ in unStreamShared (toStream m) st blank single yieldk
542-- | Lazy right associative fold.
538-- | Lazy right associative fold.
543foldr :: (IsStream t, Monad m) => (a -> b -> b) -> b -> t m a -> m b
539foldr :: (IsStream t, Monad m) => (a -> b -> b) -> b -> t m a -> m b
@@ -547,7 +543,7 @@ foldr step acc m = go (toStream m)
547 let stop = return acc
543 let stop = return acc
548 single a = return (step a acc)
544 single a = return (step a acc)
549 yieldk a r = go r >>= \b -> return (step a b)
545 yieldk a r = go r >>= \b -> return (step a b)
550− in unStream m1 defState stop single yieldk
546+ in unStreamShared m1 defState stop single yieldk
552-- | Lazy right fold with a monadic step function.
548-- | Lazy right fold with a monadic step function.
553{-# INLINE foldrM #-}
549{-# INLINE foldrM #-}
@@ -558,7 +554,7 @@ foldrM step acc m = go (toStream m)
558 let stop = return acc
554 let stop = return acc
559 single a = step a acc
555 single a = step a acc
560 yieldk a r = go r >>= step a
556 yieldk a r = go r >>= step a
561− in unStream m1 defState stop single yieldk
557+ in unStreamShared m1 defState stop single yieldk
563{-# INLINE foldr1 #-}
559{-# INLINE foldr1 #-}
564foldr1 :: (IsStream t, Monad m) => (a -> a -> a) -> t m a -> m (Maybe a)
560foldr1 :: (IsStream t, Monad m) => (a -> a -> a) -> t m a -> m (Maybe a)
@@ -572,7 +568,7 @@ foldr1 step m = do
572 let stp = return p
568 let stp = return p
573 single a = return $ step a p
569 single a = return $ step a p
574 yieldk a r = fmap (step p) (go a r)
570 yieldk a r = fmap (step p) (go a r)
575− in unStream m1 defState stp single yieldk
571+ in unStreamShared m1 defState stp single yieldk
577-- | Strict left fold with an extraction function. Like the standard strict
573-- | Strict left fold with an extraction function. Like the standard strict
578-- left fold, but applies a user supplied extraction function (the third
574-- left fold, but applies a user supplied extraction function (the third
@@ -590,7 +586,7 @@ foldx step begin done m = get $ go (toStream m) begin
590 -- XXX we are not strictly evaluating the accumulator here. Is this
586 -- XXX we are not strictly evaluating the accumulator here. Is this
592 let single = return . done
588 let single = return . done
593− in unStream m1 undefined undefined single undefined
589+ in unStreamShared m1 undefined undefined single undefined
595 -- Note, this can be implemented by making a recursive call to "go",
591 -- Note, this can be implemented by making a recursive call to "go",
596 -- however that is more expensive because of unnecessary recursion
592 -- however that is more expensive because of unnecessary recursion
@@ -601,8 +597,8 @@ foldx step begin done m = get $ go (toStream m) begin
601 single a = sng $ step acc a
597 single a = sng $ step acc a
602 yieldk a r =
598 yieldk a r =
603 let stream = go r (step acc a)
599 let stream = go r (step acc a)
604− in unStream stream defState undefined sng yld
600+ in unStreamShared stream defState undefined sng yld
605− in unStream m1 defState stop single yieldk
601+ in unStreamShared m1 defState stop single yieldk
607-- | Strict left associative fold.
603-- | Strict left associative fold.
608{-# INLINE foldl' #-}
604{-# INLINE foldl' #-}
@@ -619,7 +615,7 @@ foldxM step begin done m = go begin (toStream m)
619 let stop = acc >>= done
615 let stop = acc >>= done
620 single a = acc >>= \b -> step b a >>= done
616 single a = acc >>= \b -> step b a >>= done
621 yieldk a r = acc >>= \b -> step b a >>= \x -> go (return x) r
617 yieldk a r = acc >>= \b -> step b a >>= \x -> go (return x) r
622− in unStream m1 defState stop single yieldk
618+ in unStreamShared m1 defState stop single yieldk
624-- | Like 'foldl'' but with a monadic step function.
620-- | Like 'foldl'' but with a monadic step function.
625foldlM' :: (IsStream t, Monad m) => (b -> a -> m b) -> b -> t m a -> m b
621foldlM' :: (IsStream t, Monad m) => (b -> a -> m b) -> b -> t m a -> m b
@@ -637,7 +633,7 @@ runStream m = go (toStream m)
637 let stop = return ()
633 let stop = return ()
638 single _ = return ()
634 single _ = return ()
639 yieldk _ r = go (toStream r)
635 yieldk _ r = go (toStream r)
640− in unStream m1 defState stop single yieldk
636+ in unStreamShared m1 defState stop single yieldk
642{-# INLINE null #-}
638{-# INLINE null #-}
643null :: (IsStream t, Monad m) => t m a -> m Bool
639null :: (IsStream t, Monad m) => t m a -> m Bool
@@ -645,7 +641,7 @@ null m =
645 let stop = return True
641 let stop = return True
646 single _ = return False
642 single _ = return False
647 yieldk _ _ = return False
643 yieldk _ _ = return False
648− in unStream (toStream m) defState stop single yieldk
644+ in unStreamShared (toStream m) defState stop single yieldk
650{-# INLINE head #-}
646{-# INLINE head #-}
651head :: (IsStream t, Monad m) => t m a -> m (Maybe a)
647head :: (IsStream t, Monad m) => t m a -> m (Maybe a)
@@ -653,7 +649,7 @@ head m =
653 let stop = return Nothing
649 let stop = return Nothing
654 single a = return (Just a)
650 single a = return (Just a)
655 yieldk a _ = return (Just a)
651 yieldk a _ = return (Just a)
656− in unStream (toStream m) defState stop single yieldk
652+ in unStreamShared (toStream m) defState stop single yieldk
658{-# INLINE tail #-}
654{-# INLINE tail #-}
659tail :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
655tail :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
@@ -661,7 +657,7 @@ tail m =
661 let stop = return Nothing
657 let stop = return Nothing
662 single _ = return $ Just nil
658 single _ = return $ Just nil
663 yieldk _ r = return $ Just $ fromStream r
659 yieldk _ r = return $ Just $ fromStream r
664− in unStream (toStream m) defState stop single yieldk
660+ in unStreamShared (toStream m) defState stop single yieldk
666{-# INLINE init #-}
662{-# INLINE init #-}
667init :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
663init :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
@@ -675,7 +671,7 @@ init m = go1 (toStream m)
675 go p m1 = Stream $ \_ stp sng yld ->
671 go p m1 = Stream $ \_ stp sng yld ->
676 let single _ = sng p
672 let single _ = sng p
677 yieldk a x = yld p $ go a x
673 yieldk a x = yld p $ go a x
678− in unStream m1 defState stp single yieldk
674+ in unStreamShared m1 defState stp single yieldk
680{-# INLINE elem #-}
676{-# INLINE elem #-}
681elem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
677elem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
@@ -685,7 +681,7 @@ elem e m = go (toStream m)
685 let stop = return False
681 let stop = return False
686 single a = return (a == e)
682 single a = return (a == e)
687 yieldk a r = if a == e then return True else go r
683 yieldk a r = if a == e then return True else go r
688− in unStream m1 defState stop single yieldk
684+ in unStreamShared m1 defState stop single yieldk
690{-# INLINE notElem #-}
686{-# INLINE notElem #-}
691notElem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
687notElem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
@@ -695,7 +691,7 @@ notElem e m = go (toStream m)
695 let stop = return True
691 let stop = return True
696 single a = return (a /= e)
692 single a = return (a /= e)
697 yieldk a r = if a == e then return False else go r
693 yieldk a r = if a == e then return False else go r
698− in unStream m1 defState stop single yieldk
694+ in unStreamShared m1 defState stop single yieldk
700all :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m Bool
696all :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m Bool
701all p m = go (toStream m)
697all p m = go (toStream m)
@@ -705,7 +701,7 @@ all p m = go (toStream m)
705 | otherwise = return False
701 | otherwise = return False
706 yieldk a r | p a = go r
702 yieldk a r | p a = go r
707 | otherwise = return False
703 | otherwise = return False
708− in unStream m1 defState (return True) single yieldk
704+ in unStreamShared m1 defState (return True) single yieldk
710any :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m Bool
706any :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m Bool
711any p m = go (toStream m)
707any p m = go (toStream m)
@@ -715,7 +711,7 @@ any p m = go (toStream m)
715 | otherwise = return False
711 | otherwise = return False
716 yieldk a r | p a = return True
712 yieldk a r | p a = return True
717 | otherwise = go r
713 | otherwise = go r
718− in unStream m1 defState (return False) single yieldk
714+ in unStreamShared m1 defState (return False) single yieldk
720-- | Extract the last element of the stream, if any.
716-- | Extract the last element of the stream, if any.
721{-# INLINE last #-}
717{-# INLINE last #-}
@@ -730,7 +726,7 @@ minimum m = go Nothing (toStream m)
730 let stop = return Nothing
726 let stop = return Nothing
731 single a = return (Just a)
727 single a = return (Just a)
732 yieldk a r = go (Just a) r
728 yieldk a r = go (Just a) r
733− in unStream m1 defState stop single yieldk
729+ in unStreamShared m1 defState stop single yieldk
735 go (Just res) m1 =
731 go (Just res) m1 =
736 let stop = return (Just res)
732 let stop = return (Just res)
@@ -742,7 +738,7 @@ minimum m = go Nothing (toStream m)
742 if res <= a
738 if res <= a
743 then go (Just res) r
739 then go (Just res) r
744 else go (Just a) r
740 else go (Just a) r
745− in unStream m1 defState stop single yieldk
741+ in unStreamShared m1 defState stop single yieldk
747{-# INLINE minimumBy #-}
743{-# INLINE minimumBy #-}
@@ -754,7 +750,7 @@ minimumBy cmp m = go Nothing (toStream m)
754 let stop = return Nothing
750 let stop = return Nothing
755 single a = return (Just a)
751 single a = return (Just a)
756 yieldk a r = go (Just a) r
752 yieldk a r = go (Just a) r
757− in unStream m1 defState stop single yieldk
753+ in unStreamShared m1 defState stop single yieldk
759 go (Just res) m1 =
755 go (Just res) m1 =
760 let stop = return (Just res)
756 let stop = return (Just res)
@@ -764,7 +760,7 @@ minimumBy cmp m = go Nothing (toStream m)
764 yieldk a r = case cmp res a of
760 yieldk a r = case cmp res a of
765 GT -> go (Just a) r
761 GT -> go (Just a) r
766 _ -> go (Just res) r
762 _ -> go (Just res) r
767− in unStream m1 defState stop single yieldk
763+ in unStreamShared m1 defState stop single yieldk
769{-# INLINE maximum #-}
765{-# INLINE maximum #-}
770maximum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
766maximum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
@@ -774,7 +770,7 @@ maximum m = go Nothing (toStream m)
774 let stop = return Nothing
770 let stop = return Nothing
775 single a = return (Just a)
771 single a = return (Just a)
776 yieldk a r = go (Just a) r
772 yieldk a r = go (Just a) r
777− in unStream m1 defState stop single yieldk
773+ in unStreamShared m1 defState stop single yieldk
779 go (Just res) m1 =
775 go (Just res) m1 =
780 let stop = return (Just res)
776 let stop = return (Just res)
@@ -786,7 +782,7 @@ maximum m = go Nothing (toStream m)
786 if res <= a
782 if res <= a
787 then go (Just a) r
783 then go (Just a) r
788 else go (Just res) r
784 else go (Just res) r
789− in unStream m1 defState stop single yieldk
785+ in unStreamShared m1 defState stop single yieldk
791{-# INLINE maximumBy #-}
787{-# INLINE maximumBy #-}
792maximumBy :: (IsStream t, Monad m) => (a -> a -> Ordering) -> t m a -> m (Maybe a)
788maximumBy :: (IsStream t, Monad m) => (a -> a -> Ordering) -> t m a -> m (Maybe a)
@@ -796,7 +792,7 @@ maximumBy cmp m = go Nothing (toStream m)
796 let stop = return Nothing
792 let stop = return Nothing
797 single a = return (Just a)
793 single a = return (Just a)
798 yieldk a r = go (Just a) r
794 yieldk a r = go (Just a) r
799− in unStream m1 defState stop single yieldk
795+ in unStreamShared m1 defState stop single yieldk
801 go (Just res) m1 =
797 go (Just res) m1 =
802 let stop = return (Just res)
798 let stop = return (Just res)
@@ -806,7 +802,7 @@ maximumBy cmp m = go Nothing (toStream m)
806 yieldk a r = case cmp res a of
802 yieldk a r = case cmp res a of
807 GT -> go (Just res) r
803 GT -> go (Just res) r
808 _ -> go (Just a) r
804 _ -> go (Just a) r
809− in unStream m1 defState stop single yieldk
805+ in unStreamShared m1 defState stop single yieldk
811{-# INLINE (!!) #-}
807{-# INLINE (!!) #-}
812(!!) :: (IsStream t, Monad m) => t m a -> Int -> m (Maybe a)
808(!!) :: (IsStream t, Monad m) => t m a -> Int -> m (Maybe a)
@@ -818,7 +814,7 @@ m !! i = go i (toStream m)
818 yieldk a x | n < 0 = return Nothing
814 yieldk a x | n < 0 = return Nothing
819 | n == 0 = return $ Just a
815 | n == 0 = return $ Just a
820 | otherwise = go (n - 1) x
816 | otherwise = go (n - 1) x
821− in unStream m1 defState (return Nothing) single yieldk
817+ in unStreamShared m1 defState (return Nothing) single yieldk
823{-# INLINE lookup #-}
819{-# INLINE lookup #-}
824lookup :: (IsStream t, Monad m, Eq a) => a -> t m (a, b) -> m (Maybe b)
820lookup :: (IsStream t, Monad m, Eq a) => a -> t m (a, b) -> m (Maybe b)
@@ -829,7 +825,7 @@ lookup e m = go (toStream m)
829 | otherwise = return Nothing
825 | otherwise = return Nothing
830 yieldk (a, b) x | a == e = return $ Just b
826 yieldk (a, b) x | a == e = return $ Just b
831 | otherwise = go x
827 | otherwise = go x
832− in unStream m1 defState (return Nothing) single yieldk
828+ in unStreamShared m1 defState (return Nothing) single yieldk
834{-# INLINE findM #-}
830{-# INLINE findM #-}
835findM :: (IsStream t, Monad m) => (a -> m Bool) -> t m a -> m (Maybe a)
831findM :: (IsStream t, Monad m) => (a -> m Bool) -> t m a -> m (Maybe a)
@@ -842,7 +838,7 @@ findM p m = go (toStream m)
842 yieldk a x = do
838 yieldk a x = do
844 if b then return $ Just a else go x
840 if b then return $ Just a else go x
845− in unStream m1 defState (return Nothing) single yieldk
841+ in unStreamShared m1 defState (return Nothing) single yieldk
847{-# INLINE find #-}
843{-# INLINE find #-}
848find :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m (Maybe a)
844find :: (IsStream t, Monad m) => (a -> Bool) -> t m a -> m (Maybe a)
@@ -857,7 +853,7 @@ findIndices p = fromStream . go 0 . toStream
857 | otherwise = stp
853 | otherwise = stp
858 yieldk a x | p a = yld offset $ go (offset + 1) x
854 yieldk a x | p a = yld offset $ go (offset + 1) x
859 | otherwise = unStream (go (offset + 1) x) st stp sng yld
855 | otherwise = unStream (go (offset + 1) x) st stp sng yld
860− in unStream m1 (rstState st) stp single yieldk
856+ in unStream m1 st stp single yieldk
862------------------------------------------------------------------------------
858------------------------------------------------------------------------------
863-- Map and Fold
859-- Map and Fold
@@ -872,7 +868,7 @@ mapM_ f m = go (toStream m)
872 let stop = return ()
868 let stop = return ()
873 single a = void (f a)
869 single a = void (f a)
874 yieldk a r = f a >> go r
870 yieldk a r = f a >> go r
875− in unStream m1 defState stop single yieldk
871+ in unStreamShared m1 defState stop single yieldk
877------------------------------------------------------------------------------
873------------------------------------------------------------------------------
878-- Converting folds
874-- Converting folds
@@ -900,7 +896,7 @@ scanx step begin done m =
900 yieldk a r =
896 yieldk a r =
901 let s = step acc a
897 let s = step acc a
902 in yld (done s) (go r s)
898 in yld (done s) (go r s)
903− in unStream m1 (rstState st) stp single yieldk
899+ in unStream m1 st stp single yieldk
905{-# INLINE scanl' #-}
901{-# INLINE scanl' #-}
906scanl' :: IsStream t => (b -> a -> b) -> b -> t m a -> t m b
902scanl' :: IsStream t => (b -> a -> b) -> b -> t m a -> t m b
@@ -918,8 +914,8 @@ filter p m = fromStream $ go (toStream m)
918 let single a | p a = sng a
914 let single a | p a = sng a
919 | otherwise = stp
915 | otherwise = stp
920 yieldk a r | p a = yld a (go r)
916 yieldk a r | p a = yld a (go r)
921− | otherwise = unStream r (rstState st) stp single yieldk
917+ | otherwise = unStream r st stp single yieldk
922− in unStream m1 (rstState st) stp single yieldk
918+ in unStream m1 st stp single yieldk
924{-# INLINE take #-}
920{-# INLINE take #-}
925take :: IsStream t => Int -> t m a -> t m a
921take :: IsStream t => Int -> t m a -> t m a
@@ -929,7 +925,7 @@ take n m = fromStream $ go n (toStream m)
929 let yieldk a r = yld a (go (n1 - 1) r)
925 let yieldk a r = yld a (go (n1 - 1) r)
930 in if n1 <= 0
926 in if n1 <= 0
932− else unStream m1 (rstState st) stp sng yieldk
928+ else unStream m1 st stp sng yieldk
934{-# INLINE takeWhile #-}
930{-# INLINE takeWhile #-}
935takeWhile :: IsStream t => (a -> Bool) -> t m a -> t m a
931takeWhile :: IsStream t => (a -> Bool) -> t m a -> t m a
@@ -940,7 +936,7 @@ takeWhile p m = fromStream $ go (toStream m)
940 | otherwise = stp
936 | otherwise = stp
941 yieldk a r | p a = yld a (go r)
937 yieldk a r | p a = yld a (go r)
942 | otherwise = stp
938 | otherwise = stp
943− in unStream m1 (rstState st) stp single yieldk
939+ in unStream m1 st stp single yieldk
945drop :: IsStream t => Int -> t m a -> t m a
941drop :: IsStream t => Int -> t m a -> t m a
946drop n m = fromStream $ Stream $ \st stp sng yld ->
942drop n m = fromStream $ Stream $ \st stp sng yld ->
@@ -951,8 +947,8 @@ drop n m = fromStream $ Stream $ \st stp sng yld ->
951 yieldk _ r = (unStream $ go (n1 - 1) r) st stp sng yld
947 yieldk _ r = (unStream $ go (n1 - 1) r) st stp sng yld
952 -- Somehow "<=" check performs better than a ">"
948 -- Somehow "<=" check performs better than a ">"
953 in if n1 <= 0
949 in if n1 <= 0
954− then unStream m1 st stp sng yld
950+ then unStreamShared m1 st stp sng yld
955− else unStream m1 st stp single yieldk
951+ else unStreamShared m1 st stp single yieldk
957{-# INLINE dropWhile #-}
953{-# INLINE dropWhile #-}
958dropWhile :: IsStream t => (a -> Bool) -> t m a -> t m a
954dropWhile :: IsStream t => (a -> Bool) -> t m a -> t m a
@@ -961,9 +957,9 @@ dropWhile p m = fromStream $ go (toStream m)
961 go m1 = Stream $ \st stp sng yld ->
957 go m1 = Stream $ \st stp sng yld ->
962 let single a | p a = stp
958 let single a | p a = stp
963 | otherwise = sng a
959 | otherwise = sng a
964− yieldk a r | p a = unStream r (rstState st) stp single yieldk
960+ yieldk a r | p a = unStream r st stp single yieldk
965 | otherwise = yld a r
961 | otherwise = yld a r
966− in unStream m1 (rstState st) stp single yieldk
962+ in unStream m1 st stp single yieldk
968-------------------------------------------------------------------------------
964-------------------------------------------------------------------------------
969-- Mapping
965-- Mapping
@@ -974,7 +970,7 @@ map :: (IsStream t, Monad m) => (a -> b) -> t m a -> t m b
974map f m = fromStream $ Stream $ \st stp sng yld ->
970map f m = fromStream $ Stream $ \st stp sng yld ->
975 let single = sng . f
971 let single = sng . f
976 yieldk a r = yld (f a) (fmap f r)
972 yieldk a r = yld (f a) (fmap f r)
977− in unStream (toStream m) (rstState st) stp single yieldk
973+ in unStream (toStream m) st stp single yieldk
979-- Be careful when modifying this, this uses a consM (|:) deliberately to allow
975-- Be careful when modifying this, this uses a consM (|:) deliberately to allow
980-- other stream types to overload it.
976-- other stream types to overload it.
@@ -984,8 +980,8 @@ mapM f m = go (toStream m)
985 go m1 = fromStream $ Stream $ \st stp sng yld ->
981 go m1 = fromStream $ Stream $ \st stp sng yld ->
986 let single a = f a >>= sng
982 let single a = f a >>= sng
987− yieldk a r = unStream (toStream (f a |: go r)) st stp sng yld
983+ yieldk a r = unStreamShared (toStream (f a |: go r)) st stp sng yld
988− in unStream m1 (rstState st) stp single yieldk
984+ in unStream m1 st stp single yieldk
990-- Be careful when modifying this, this uses a consM (|:) deliberately to allow
986-- Be careful when modifying this, this uses a consM (|:) deliberately to allow
991-- other stream types to overload it.
987-- other stream types to overload it.
@@ -995,8 +991,8 @@ sequence m = go (toStream m)
996 go m1 = fromStream $ Stream $ \st stp sng yld ->
992 go m1 = fromStream $ Stream $ \st stp sng yld ->
997 let single ma = ma >>= sng
993 let single ma = ma >>= sng
998− yieldk ma r = unStream (toStream $ ma |: go r) st stp sng yld
994+ yieldk ma r = unStreamShared (toStream $ ma |: go r) st stp sng yld
999− in unStream m1 (rstState st) stp single yieldk
995+ in unStream m1 st stp single yieldk
1001-------------------------------------------------------------------------------
997-------------------------------------------------------------------------------
1002-- Inserting
998-- Inserting
@@ -1007,12 +1003,12 @@ intersperseM :: (IsStream t, MonadAsync m) => m a -> t m a -> t m a
1007intersperseM a m = fromStream $ prependingStart (toStream m)
1003intersperseM a m = fromStream $ prependingStart (toStream m)
1009 prependingStart m1 = Stream $ \st stp sng yld ->
1005 prependingStart m1 = Stream $ \st stp sng yld ->
1010− let yieldk i x = unStream (return i |: go x) st stp sng yld
1006+ let yieldk i x = unStreamShared (return i |: go x) st stp sng yld
1011− in unStream m1 (rstState st) stp sng yieldk
1007+ in unStream m1 st stp sng yieldk
1012 go m2 = fromStream $ Stream $ \st stp sng yld ->
1008 go m2 = fromStream $ Stream $ \st stp sng yld ->
1013− let single i = unStream (a |: yield i) st stp sng yld
1009+ let single i = unStreamShared (a |: yield i) st stp sng yld
1014− yieldk i x = unStream (a |: return i |: go x) st stp sng yld
1010+ yieldk i x = unStreamShared (a |: return i |: go x) st stp sng yld
1015− in unStream m2 (rstState st) stp single yieldk
1011+ in unStream m2 st stp single yieldk
1017{-# INLINE insertBy #-}
1013{-# INLINE insertBy #-}
1018insertBy :: IsStream t => (a -> a -> Ordering) -> a -> t m a -> t m a
1014insertBy :: IsStream t => (a -> a -> Ordering) -> a -> t m a -> t m a
@@ -1026,7 +1022,7 @@ insertBy cmp x m = fromStream $ go (toStream m)
1026 yieldk a r = case cmp x a of
1022 yieldk a r = case cmp x a of
1027 GT -> yld a (go r)
1023 GT -> yld a (go r)
1028 _ -> yld x (a `cons` r)
1024 _ -> yld x (a `cons` r)
1029− in unStream m1 (rstState st) stop single yieldk
1025+ in unStream m1 st stop single yieldk
1031------------------------------------------------------------------------------
1027------------------------------------------------------------------------------
1032-- Deleting
1028-- Deleting
@@ -1039,9 +1035,9 @@ deleteBy eq x m = fromStream $ go (toStream m)
1039 go m1 = Stream $ \st stp sng yld ->
1035 go m1 = Stream $ \st stp sng yld ->
1040 let single a = if eq x a then stp else sng a
1036 let single a = if eq x a then stp else sng a
1041 yieldk a r = if eq x a
1037 yieldk a r = if eq x a
1042− then unStream r (rstState st) stp sng yld
1038+ then unStream r st stp sng yld
1043 else yld a (go r)
1039 else yld a (go r)
1044− in unStream m1 (rstState st) stp single yieldk
1040+ in unStream m1 st stp single yieldk
1046-------------------------------------------------------------------------------
1042-------------------------------------------------------------------------------
1047-- Map and Filter
1043-- Map and Filter
@@ -1057,8 +1053,8 @@ mapMaybe f m = go (toStream m)
1057 Nothing -> stp
1053 Nothing -> stp
1058 yieldk a r = case f a of
1054 yieldk a r = case f a of
1059 Just b -> yld b (toStream $ go r)
1055 Just b -> yld b (toStream $ go r)
1060− Nothing -> unStream r (rstState st) stp single yieldk
1056+ Nothing -> unStream r st stp single yieldk
1061− in unStream m1 (rstState st) stp single yieldk
1057+ in unStream m1 st stp single yieldk
1063------------------------------------------------------------------------------
1059------------------------------------------------------------------------------
1064-- Serial Zipping
1060-- Serial Zipping
@@ -1072,10 +1068,10 @@ zipWithS f = go
1072 let merge a ra =
1068 let merge a ra =
1073 let single2 b = sng (f a b)
1069 let single2 b = sng (f a b)
1074 yield2 b rb = yld (f a b) (go ra rb)
1070 yield2 b rb = yld (f a b) (go ra rb)
1075− in unStream my (rstState st) stp single2 yield2
1071+ in unStream my st stp single2 yield2
1076 let single1 a = merge a nil
1072 let single1 a = merge a nil
1077 yield1 = merge
1073 yield1 = merge
1078− unStream mx (rstState st) stp single1 yield1
1074+ unStream mx st stp single1 yield1
1080-- | Zip two streams serially using a pure zipping function.
1076-- | Zip two streams serially using a pure zipping function.
@@ -1092,13 +1088,13 @@ zipWithM f m1 m2 = fromStream $ go (toStream m1) (toStream m2)
1093 go mx my = Stream $ \st stp sng yld -> do
1089 go mx my = Stream $ \st stp sng yld -> do
1094 let merge a ra =
1090 let merge a ra =
1095− let runIt x = unStream x (rstState st) stp sng yld
1091+ let runIt x = unStream x st stp sng yld
1096 single2 b = f a b >>= sng
1092 single2 b = f a b >>= sng
1097 yield2 b rb = f a b >>= \x -> runIt (x `cons` go ra rb)
1093 yield2 b rb = f a b >>= \x -> runIt (x `cons` go ra rb)
1098− in unStream my (rstState st) stp single2 yield2
1094+ in unStream my st stp single2 yield2
1099 let single1 a = merge a nil
1095 let single1 a = merge a nil
1100 yield1 = merge
1096 yield1 = merge
1101− unStream mx (rstState st) stp single1 yield1
1097+ unStream mx st stp single1 yield1
1103------------------------------------------------------------------------------
1099------------------------------------------------------------------------------
1104-- Merging
1100-- Merging
@@ -1158,7 +1154,7 @@ the m = do
1158 | otherwise = return Nothing
1154 | otherwise = return Nothing
1159 yieldk a r | h == a = go h r
1155 yieldk a r | h == a = go h r
1160 | otherwise = return Nothing
1156 | otherwise = return Nothing
1161− in unStream m1 defState (return $ Just h) single yieldk
1157+ in unStreamShared m1 defState (return $ Just h) single yieldk
1163------------------------------------------------------------------------------
1159------------------------------------------------------------------------------
1164-- Semigroup
1160-- Semigroup
@@ -1171,7 +1167,7 @@ serial :: Stream m a -> Stream m a -> Stream m a
1171serial m1 m2 = go m1
1167serial m1 m2 = go m1
1173 go (Stream m) = Stream $ \st stp sng yld ->
1169 go (Stream m) = Stream $ \st stp sng yld ->
1174− let stop = unStream m2 (rstState st) stp sng yld
1170+ let stop = unStream m2 st stp sng yld
1175 single a = yld a m2
1171 single a = yld a m2
1176 yieldk a r = yld a (go r)
1172 yieldk a r = yld a (go r)
1177 in m (rstState st) stop single yieldk
1173 in m (rstState st) stop single yieldk
@@ -1209,7 +1205,7 @@ bindWith par m f = go m
1209 go (Stream g) =
1205 go (Stream g) =
1210 Stream $ \st stp sng yld ->
1206 Stream $ \st stp sng yld ->
1211 let runShared x = unStreamShared x st stp sng yld
1207 let runShared x = unStreamShared x st stp sng yld
1212− runIsolated x = unStreamIsolated x st stp sng yld
1208+ runIsolated x = unStream x st stp sng yld
1214 single a = runIsolated $ f a
1210 single a = runIsolated $ f a
1215 yieldk a r = runShared $ isolateStream (f a) `par` go r
1211 yieldk a r = runShared $ isolateStream (f a) `par` go r
@@ -1221,8 +1217,8 @@ bindWith par m f = go m
1222_alt :: Stream m a -> Stream m a -> Stream m a
1218_alt :: Stream m a -> Stream m a -> Stream m a
1223_alt m1 m2 = Stream $ \st stp sng yld ->
1219_alt m1 m2 = Stream $ \st stp sng yld ->
1224− let stop = unStream m2 (rstState st) stp sng yld
1220+ let stop = unStream m2 st stp sng yld
1225− in unStream m1 (rstState st) stop sng yld
1221+ in unStream m1 st stop sng yld
1227------------------------------------------------------------------------------
1223------------------------------------------------------------------------------
1228-- MonadReader
1224-- MonadReader
@@ -1233,7 +1229,7 @@ withLocal f m =
1233 Stream $ \st stp sng yld ->
1229 Stream $ \st stp sng yld ->
1234 let single = local f . sng
1230 let single = local f . sng
1235 yieldk a r = local f $ yld a (withLocal f r)
1231 yieldk a r = local f $ yld a (withLocal f r)
1236− in unStream m (rstState st) (local f stp) single yieldk
1232+ in unStream m st (local f stp) single yieldk
1238------------------------------------------------------------------------------
1234------------------------------------------------------------------------------
1239-- MonadError
1235-- MonadError