@@ -76,10 +76,18 @@ module Streamly.Internal.Data.Unfold
7676 , singleton
7777 , identity
7878 , const
79− , replicateM
80− , repeatM
79+
8180 , fromList
8281 , fromListM
82+
83+ -- ** Specialized Generation
84+ -- | Generate a monadic stream from a seed.
85+ , replicateM
86+ , repeatM
87+ , iterateM
88+ , fromIndicesM
89+
90+ -- ** Enumerations
8391 , enumerateFromStepIntegral
8492 , enumerateFromToIntegral
8593 , enumerateFromIntegral
@@ -453,6 +461,7 @@ fromListM = Unfold step inject
453461-- Specialized Generation
454462------------------------------------------------------------------------------
455463
464+-- XXX replicateM? Maybe just replicate?
456465-- | Generates a stream replicating the seed @n@ times.
457466--
458467{-# INLINE replicateM #-}
@@ -466,6 +475,7 @@ replicateM n = Unfold step inject
466475 then Stop
467476 else Yield x (x, i - 1)
468477
478+-- XXX repeatM? Maybe just repeat?
469479-- | Generates an infinite stream repeating the seed.
470480--
471481{-# INLINE repeatM #-}
@@ -475,6 +485,24 @@ repeatM = Unfold step return
475485 {-# INLINE_LATE step #-}
476486 step x = return $ Yield x x
477487
488+{-# INLINE iterateM #-}
489+iterateM :: Monad m => (a -> m a) -> Unfold m a a
490+iterateM f = Unfold step f
491+ where
492+ {-# INLINE_LATE step #-}
493+ step x = do
494+ fx <- f x
495+ return $ Yield fx fx
496+
497+{-# INLINE_NORMAL fromIndicesM #-}
498+fromIndicesM :: Monad m => (Int -> m a) -> Unfold m Int a
499+fromIndicesM gen = Unfold step return
500+ where
501+ {-# INLINE_LATE step #-}
502+ step i = do
503+ x <- gen i
504+ return $ Yield x (i + 1)
505+
478506-------------------------------------------------------------------------------
479507-- Filtering
480508-------------------------------------------------------------------------------