@@ -78,6 +78,8 @@ module Streamly.Internal.Data.Stream.StreamD
7878 , fromIndicesM
7979 , generate
8080 , generateM
81+ , iterate
82+ , iterateM
8183
8284 -- ** Enumerations
8385 , enumerateFromStepIntegral
@@ -324,7 +326,7 @@ import Prelude
324326 takeWhile, drop, dropWhile, all, any, maximum, minimum, elem,
325327 notElem, null, head, tail, zipWith, lookup, foldr1, sequence,
326328 (!!), scanl, scanl1, concatMap, replicate, enumFromTo, concat,
327− reverse)
329+ reverse, iterate)
328330
329331import qualified Control.Monad.Catch as MC
330332import qualified Control.Monad.Reader as Reader
@@ -448,12 +450,22 @@ unfold (Unfold ustep inject) seed = Stream step Nothing
448450-- Specialized Generation
449451------------------------------------------------------------------------------
450452
453+{-# INLINE_NORMAL repeatM #-}
451454repeatM :: Monad m => m a -> Stream m a
452455repeatM x = Stream (\_ _ -> x >>= \r -> return $ Yield r ()) ()
453456
457+{-# INLINE_NORMAL repeat #-}
454458repeat :: Monad m => a -> Stream m a
455459repeat x = Stream (\_ _ -> return $ Yield x ()) ()
456460
461+{-# INLINE_NORMAL iterateM #-}
462+iterateM :: Monad m => (a -> m a) -> m a -> Stream m a
463+iterateM step = Stream (\_ st -> st >>= \x -> return $ Yield x (step x))
464+
465+{-# INLINE_NORMAL iterate #-}
466+iterate :: Monad m => (a -> a) -> a -> Stream m a
467+iterate step st = iterateM (return . step) (return st)
468+
457469{-# INLINE_NORMAL replicateM #-}
458470replicateM :: forall m a. Monad m => Int -> m a -> Stream m a
459471replicateM n p = Stream step n