arrow-fx-coroutines / arrow.fx.coroutines.stream / scanChunksOpt
fun <O, S, O2>
Pull
<O,
Unit
>.scanChunksOpt(init: S, f: (S) -> ((
Chunk
<O>) ->
Pair
<S,
Chunk
<O2>>)?):
Pull
<O2, S>
More general version of scanChunks
where the current state (i.e., S
) can be inspected
to determine if another chunk should be pulled or if the pull should terminate.
Termination is signaled by returning None
from f
. Otherwise, a function which consumes
the next chunk is returned wrapped in Some
. The final state value is returned as the
result of the pull.
fun <O, S, O2>
Stream
<O>.scanChunksOpt(init: S, f: (S) -> ((
Chunk
<O>) ->
Pair
<S,
Chunk
<O2>>)?):
Stream
<O2>
More general version of scanChunks
where the current state (i.e., S
) can be inspected
to determine if another chunk should be pulled or if the stream should terminate.
Termination is signaled by returning null
from f
. Otherwise, a function which consumes
the next chunk.
import arrow.fx.coroutines.stream.*
//sampleStart
fun <O> Stream<O>.take(n: Int): Stream<O> =
scanChunksOpt<O, Int, O>(n) { n ->
if (n <= 0) null
else { chunk: Chunk<O> ->
if (chunk.size() < n) Pair(n - chunk.size(), chunk)
else Pair(0, chunk.take(n))
}
}
suspend fun main(): Unit =
Stream.range(0..100).take(5)
.toList().let(::println) // [0, 1, 2, 3, 4]
//sampleEnd
Do you like Arrow?
✖