@@ -76,10 +76,18 @@ module Streamly.Internal.Data.Unfold
76 , singleton
76 , singleton
77 , identity
77 , identity
81 , fromList
80 , fromList
82 , fromListM
81 , fromListM
83+ -- ** Specialized Generation
84+ -- | Generate a monadic stream from a seed.
83 , enumerateFromStepIntegral
91 , enumerateFromStepIntegral
84 , enumerateFromToIntegral
92 , enumerateFromToIntegral
85 , enumerateFromIntegral
93 , enumerateFromIntegral
@@ -453,6 +461,7 @@ fromListM = Unfold step inject
453-- Specialized Generation
461-- Specialized Generation
454------------------------------------------------------------------------------
462------------------------------------------------------------------------------
464+-- XXX replicateM? Maybe just replicate?
456-- | Generates a stream replicating the seed @n@ times.
465-- | Generates a stream replicating the seed @n@ times.
458{-# INLINE replicateM #-}
467{-# INLINE replicateM #-}
@@ -466,6 +475,7 @@ replicateM n = Unfold step inject
466 then Stop
475 then Stop
467 else Yield x (x, i - 1)
476 else Yield x (x, i - 1)
478+-- XXX repeatM? Maybe just repeat?
469-- | Generates an infinite stream repeating the seed.
479-- | Generates an infinite stream repeating the seed.
471{-# INLINE repeatM #-}
481{-# INLINE repeatM #-}
@@ -475,6 +485,24 @@ repeatM = Unfold step return
475 {-# INLINE_LATE step #-}
485 {-# INLINE_LATE step #-}
476 step x = return $ Yield x x
486 step x = return $ Yield x x
488+{-# INLINE iterateM #-}
489+iterateM :: Monad m => (a -> m a) -> Unfold m a a
490+iterateM f = Unfold step f
492+ {-# INLINE_LATE step #-}
495+ return $ Yield fx fx
497+{-# INLINE_NORMAL fromIndicesM #-}
498+fromIndicesM :: Monad m => (Int -> m a) -> Unfold m Int a
499+fromIndicesM gen = Unfold step return
501+ {-# INLINE_LATE step #-}
504+ return $ Yield x (i + 1)
478-------------------------------------------------------------------------------
506-------------------------------------------------------------------------------
479-- Filtering
507-- Filtering
480-------------------------------------------------------------------------------
508-------------------------------------------------------------------------------