Miguel Vargas
08/29/2019, 1:04 AMsuspend
functions. The keyword is not very well documented but it does say that they can only be used from a coroutine. But then I ran into sequence's yield()
which is a suspend function that it is called from a SequenceScope which is not a coroutine scope. As far as I know Sequences have been in Kotlin 1.0 so it precedes coroutines? I guess I'm trying to get a more basic understanding of suspend functions.Casey Brooks
08/29/2019, 1:28 AMsuspend
can only be called from other functions which are marked suspend
. However, lambdas can also be marked suspend, and this is the magic that makes it all work. Certain non-suspend
functions create the root scope for coroutines to live within, and these functions expose that scope through a suspending lambda, which is part of the function definition.
For Sequences, the sequence { }
call needs a block of type suspend SequenceScope<T>.() -> Unit
(notice it's marked suspend
). The Receiver is SequenceScope
, and yield()
is a function on SequenceScope
, but it is also marked as suspend
, which means it can only be called from within another suspending
function. Because the lambda of sequence
is a suspending function, you can call yield()
within that lambda