@@ -27,6 +27,7 @@ module Streamly.Internal.Data.Stream.Generate
2727 , Stream.fromPure
2828 , Stream.fromEffect
2929 , repeat
30+ , repeatM
3031 , replicate
3132
3233 -- * Enumeration
@@ -85,13 +86,15 @@ import qualified Streamly.Internal.Data.Stream.Bottom as Bottom
8586import qualified Streamly.Internal.Data.Stream.StreamD as D
8687import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
8788import qualified Streamly.Internal.Data.Stream.Type as Stream
89+import qualified Streamly.Internal.Data.Stream.Transform as Stream (sequence)
8890
8991import Prelude hiding (iterate, replicate, repeat)
9092
9193-- $setup
9294-- >>> :m
9395-- >>> import Control.Concurrent (threadDelay)
94−-- >>> import Data.Function ((&))
96+-- >>> import Data.Function (fix, (&))
97+-- >>> import Data.Semigroup (cycle1)
9598-- >>> import qualified Streamly.Data.Fold as Fold
9699-- >>> import qualified Streamly.Data.Unfold as Unfold
97100-- >>> import qualified Streamly.Internal.Data.Stream as Stream
@@ -178,6 +181,26 @@ unfoldrM step = fromStreamD . D.unfoldrM step
178181repeat :: Monad m => a -> Stream m a
179182repeat = fromStreamD . D.repeat
180183
184+-- |
185+-- >>> repeatM = Stream.sequence . Stream.repeat
186+-- >>> repeatM = fix . Stream.consM
187+-- >>> repeatM = cycle1 . Stream.fromEffect
188+--
189+-- Generate a stream by repeatedly executing a monadic action forever.
190+--
191+-- >>> :{
192+-- repeatAction =
193+-- Stream.repeatM (threadDelay 1000000 >> print 1)
194+-- & Stream.take 10
195+-- & Stream.fold Fold.drain
196+-- :}
197+--
198+-- /Pre-release/
199+--
200+{-# INLINE_NORMAL repeatM #-}
201+repeatM :: Monad m => m a -> Stream m a
202+repeatM = Stream.sequence . repeat
203+
181204-- |
182205-- >>> replicate n = Stream.take n . Stream.repeat
183206--