@@ -89,6 +89,10 @@ module Streamly.Internal.Data.Stream.StreamD.Type
8989 , concatMapM
9090 , concatEffect
9191
92+ , iterateUnfoldManyDFS
93+ , iterateUnfoldManyBFS
94+ , iterateUnfoldManyBFSRev
95+
9296 , iterateConcatScan
9397 , iterateConcatMapDFS
9498 , iterateConcatMapBFS
@@ -1006,6 +1010,126 @@ iterateConcatMapDFS f stream = Stream step (stream, [])
10061010 (y:ys) -> return $ Skip (y, ys)
10071011 [] -> return Stop
10081012
1013+{-# ANN type IterateUnfoldState Fuse #-}
1014+data IterateUnfoldState o i =
1015+ IterateUnfoldOuter o
1016+ | IterateUnfoldInner o i [i]
1017+
1018+{-# INLINE_NORMAL iterateUnfoldManyDFS #-}
1019+iterateUnfoldManyDFS :: Monad m =>
1020+ Unfold m a a
1021+ -> Stream m a
1022+ -> Stream m a
1023+iterateUnfoldManyDFS (Unfold istep inject) (Stream ostep ost) =
1024+ Stream step (IterateUnfoldOuter ost)
1025+
1026+ where
1027+
1028+ {-# INLINE_LATE step #-}
1029+ step gst (IterateUnfoldOuter o) = do
1030+ r <- ostep (adaptState gst) o
1031+ case r of
1032+ Yield a s -> do
1033+ i <- inject a
1034+ i `seq` return (Yield a (IterateUnfoldInner s i []))
1035+ Skip s -> return $ Skip (IterateUnfoldOuter s)
1036+ Stop -> return Stop
1037+
1038+ step _ (IterateUnfoldInner o i ii) = do
1039+ r <- istep i
1040+ case r of
1041+ Yield x s -> do
1042+ i1 <- inject x
1043+ i1 `seq` return $ Yield x (IterateUnfoldInner o i1 (s:ii))
1044+ Skip s -> return $ Skip (IterateUnfoldInner o s ii)
1045+ Stop ->
1046+ case ii of
1047+ (y:ys) -> return $ Skip (IterateUnfoldInner o y ys)
1048+ [] -> return $ Skip (IterateUnfoldOuter o)
1049+
1050+{-# ANN type IterateUnfoldBFSRevState Fuse #-}
1051+data IterateUnfoldBFSRevState o i =
1052+ IterateUnfoldBFSRevOuter o [i]
1053+ | IterateUnfoldBFSRevInner i [i]
1054+
1055+{-# INLINE_NORMAL iterateUnfoldManyBFSRev #-}
1056+iterateUnfoldManyBFSRev :: Monad m =>
1057+ Unfold m a a
1058+ -> Stream m a
1059+ -> Stream m a
1060+iterateUnfoldManyBFSRev (Unfold istep inject) (Stream ostep ost) =
1061+ Stream step (IterateUnfoldBFSRevOuter ost [])
1062+
1063+ where
1064+
1065+ {-# INLINE_LATE step #-}
1066+ step gst (IterateUnfoldBFSRevOuter o ii) = do
1067+ r <- ostep (adaptState gst) o
1068+ case r of
1069+ Yield a s -> do
1070+ i <- inject a
1071+ i `seq` return (Yield a (IterateUnfoldBFSRevOuter s (i:ii)))
1072+ Skip s -> return $ Skip (IterateUnfoldBFSRevOuter s ii)
1073+ Stop ->
1074+ case ii of
1075+ (y:ys) -> return $ Skip (IterateUnfoldBFSRevInner y ys)
1076+ [] -> return Stop
1077+
1078+ step _ (IterateUnfoldBFSRevInner i ii) = do
1079+ r <- istep i
1080+ case r of
1081+ Yield x s -> do
1082+ i1 <- inject x
1083+ i1 `seq` return $ Yield x (IterateUnfoldBFSRevInner s (i1:ii))
1084+ Skip s -> return $ Skip (IterateUnfoldBFSRevInner s ii)
1085+ Stop ->
1086+ case ii of
1087+ (y:ys) -> return $ Skip (IterateUnfoldBFSRevInner y ys)
1088+ [] -> return Stop
1089+
1090+{-# ANN type IterateUnfoldBFSState Fuse #-}
1091+data IterateUnfoldBFSState o i =
1092+ IterateUnfoldBFSOuter o [i]
1093+ | IterateUnfoldBFSInner i [i] [i]
1094+
1095+{-# INLINE_NORMAL iterateUnfoldManyBFS #-}
1096+iterateUnfoldManyBFS :: Monad m =>
1097+ Unfold m a a
1098+ -> Stream m a
1099+ -> Stream m a
1100+iterateUnfoldManyBFS (Unfold istep inject) (Stream ostep ost) =
1101+ Stream step (IterateUnfoldBFSOuter ost [])
1102+
1103+ where
1104+
1105+ {-# INLINE_LATE step #-}
1106+ step gst (IterateUnfoldBFSOuter o rii) = do
1107+ r <- ostep (adaptState gst) o
1108+ case r of
1109+ Yield a s -> do
1110+ i <- inject a
1111+ i `seq` return (Yield a (IterateUnfoldBFSOuter s (i:rii)))
1112+ Skip s -> return $ Skip (IterateUnfoldBFSOuter s rii)
1113+ Stop ->
1114+ case reverse rii of
1115+ (y:ys) -> return $ Skip (IterateUnfoldBFSInner y ys [])
1116+ [] -> return Stop
1117+
1118+ step _ (IterateUnfoldBFSInner i ii rii) = do
1119+ r <- istep i
1120+ case r of
1121+ Yield x s -> do
1122+ i1 <- inject x
1123+ i1 `seq` return $ Yield x (IterateUnfoldBFSInner s ii (i1:rii))
1124+ Skip s -> return $ Skip (IterateUnfoldBFSInner s ii rii)
1125+ Stop ->
1126+ case ii of
1127+ (y:ys) -> return $ Skip (IterateUnfoldBFSInner y ys rii)
1128+ [] ->
1129+ case reverse rii of
1130+ (y:ys) -> return $ Skip (IterateUnfoldBFSInner y ys [])
1131+ [] -> return Stop
1132+
10091133------------------------------------------------------------------------------
10101134-- Grouping/Splitting
10111135------------------------------------------------------------------------------