@@ -89,6 +89,10 @@ module Streamly.Internal.Data.Stream.StreamD.Type
89 , concatMapM
89 , concatMapM
90 , concatEffect
90 , concatEffect
92+ , iterateUnfoldManyDFS
93+ , iterateUnfoldManyBFS
94+ , iterateUnfoldManyBFSRev
92 , iterateConcatScan
96 , iterateConcatScan
93 , iterateConcatMapDFS
97 , iterateConcatMapDFS
94 , iterateConcatMapBFS
98 , iterateConcatMapBFS
@@ -1006,6 +1010,126 @@ iterateConcatMapDFS f stream = Stream step (stream, [])
1006 (y:ys) -> return $ Skip (y, ys)
1010 (y:ys) -> return $ Skip (y, ys)
1007 [] -> return Stop
1011 [] -> return Stop
1013+{-# ANN type IterateUnfoldState Fuse #-}
1014+data IterateUnfoldState o i =
1015+ IterateUnfoldOuter o
1016+ | IterateUnfoldInner o i [i]
1018+{-# INLINE_NORMAL iterateUnfoldManyDFS #-}
1019+iterateUnfoldManyDFS :: Monad m =>
1023+iterateUnfoldManyDFS (Unfold istep inject) (Stream ostep ost) =
1024+ Stream step (IterateUnfoldOuter ost)
1028+ {-# INLINE_LATE step #-}
1029+ step gst (IterateUnfoldOuter o) = do
1030+ r <- ostep (adaptState gst) o
1034+ i `seq` return (Yield a (IterateUnfoldInner s i []))
1035+ Skip s -> return $ Skip (IterateUnfoldOuter s)
1036+ Stop -> return Stop
1038+ step _ (IterateUnfoldInner o i ii) = do
1043+ i1 `seq` return $ Yield x (IterateUnfoldInner o i1 (s:ii))
1044+ Skip s -> return $ Skip (IterateUnfoldInner o s ii)
1047+ (y:ys) -> return $ Skip (IterateUnfoldInner o y ys)
1048+ [] -> return $ Skip (IterateUnfoldOuter o)
1050+{-# ANN type IterateUnfoldBFSRevState Fuse #-}
1051+data IterateUnfoldBFSRevState o i =
1052+ IterateUnfoldBFSRevOuter o [i]
1053+ | IterateUnfoldBFSRevInner i [i]
1055+{-# INLINE_NORMAL iterateUnfoldManyBFSRev #-}
1056+iterateUnfoldManyBFSRev :: Monad m =>
1060+iterateUnfoldManyBFSRev (Unfold istep inject) (Stream ostep ost) =
1061+ Stream step (IterateUnfoldBFSRevOuter ost [])
1065+ {-# INLINE_LATE step #-}
1066+ step gst (IterateUnfoldBFSRevOuter o ii) = do
1067+ r <- ostep (adaptState gst) o
1071+ i `seq` return (Yield a (IterateUnfoldBFSRevOuter s (i:ii)))
1072+ Skip s -> return $ Skip (IterateUnfoldBFSRevOuter s ii)
1075+ (y:ys) -> return $ Skip (IterateUnfoldBFSRevInner y ys)
1078+ step _ (IterateUnfoldBFSRevInner i ii) = do
1083+ i1 `seq` return $ Yield x (IterateUnfoldBFSRevInner s (i1:ii))
1084+ Skip s -> return $ Skip (IterateUnfoldBFSRevInner s ii)
1087+ (y:ys) -> return $ Skip (IterateUnfoldBFSRevInner y ys)
1090+{-# ANN type IterateUnfoldBFSState Fuse #-}
1091+data IterateUnfoldBFSState o i =
1092+ IterateUnfoldBFSOuter o [i]
1093+ | IterateUnfoldBFSInner i [i] [i]
1095+{-# INLINE_NORMAL iterateUnfoldManyBFS #-}
1096+iterateUnfoldManyBFS :: Monad m =>
1100+iterateUnfoldManyBFS (Unfold istep inject) (Stream ostep ost) =
1101+ Stream step (IterateUnfoldBFSOuter ost [])
1105+ {-# INLINE_LATE step #-}
1106+ step gst (IterateUnfoldBFSOuter o rii) = do
1107+ r <- ostep (adaptState gst) o
1111+ i `seq` return (Yield a (IterateUnfoldBFSOuter s (i:rii)))
1112+ Skip s -> return $ Skip (IterateUnfoldBFSOuter s rii)
1114+ case reverse rii of
1115+ (y:ys) -> return $ Skip (IterateUnfoldBFSInner y ys [])
1118+ step _ (IterateUnfoldBFSInner i ii rii) = do
1123+ i1 `seq` return $ Yield x (IterateUnfoldBFSInner s ii (i1:rii))
1124+ Skip s -> return $ Skip (IterateUnfoldBFSInner s ii rii)
1127+ (y:ys) -> return $ Skip (IterateUnfoldBFSInner y ys rii)
1129+ case reverse rii of
1130+ (y:ys) -> return $ Skip (IterateUnfoldBFSInner y ys [])
1009------------------------------------------------------------------------------
1133------------------------------------------------------------------------------
1010-- Grouping/Splitting
1134-- Grouping/Splitting
1011------------------------------------------------------------------------------
1135------------------------------------------------------------------------------