>>> iterateM f m = m >>= \a -> return a `Stream.consM` iterateM f (f a)
Generate an infinite stream with the first element generated by the
action
m and each successive element derived by applying the
monadic function
f on the previous element.
>>> pr n = threadDelay 1000000 >> print n
>>> :{
Stream.iterateM (\x -> pr x >> return (x + 1)) (return 0)
& Stream.take 3
& Stream.fromSerial
& Stream.toList
:}
0
1
[0,1,2]
When run concurrently, the next iteration can run concurrently with
the processing of the previous iteration. Note that more than one
iteration cannot run concurrently as the next iteration depends on the
output of the previous iteration.
>>> :{
Stream.iterateM (\x -> pr x >> return (x + 1)) (return 0)
& Stream.delay 1
& Stream.take 3
& Stream.fromAsync
& Stream.toList
:}
0
1
...
Concurrent
Since: 0.1.2
Since: 0.7.0 (signature change)