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