Coroutines Concepts
Sequential Suspend Calls
Multiple suspend calls in one coroutine still read like ordinary top-to-bottom code.
Sequential Suspend Calls
SequentialSuspendCalls.kt
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine
suspend fun addBonus(value: Int, bonus: Int): Int {
return value + bonus
}
suspend fun labelScore(score: Int): String {
return if (score >= 10) "ready:$score" else "waiting:$score"
}
fun main() {
val bonus =
var output = "pending"
val work: suspend () -> String = {
val first = addBonus(5, bonus)
val second = addBonus(first, 2)
labelScore(second)
}
work.startCoroutine(object : Continuation<String> {
override val context = EmptyCoroutineContext
override fun resumeWith(result: Result<String>) {
output = result.getOrThrow()
}
})
println("output=$output")
}
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine
suspend fun addBonus(value: Int, bonus: Int): Int {
return value + bonus
}
suspend fun labelScore(score: Int): String {
return if (score >= 10) "ready:$score" else "waiting:$score"
}
fun main() {
val bonus =
var output = "pending"
val work: suspend () -> String = {
val first = addBonus(5, bonus)
val second = addBonus(first, 2)
labelScore(second)
}
work.startCoroutine(object : Continuation<String> {
override val context = EmptyCoroutineContext
override fun resumeWith(result: Result<String>) {
output = result.getOrThrow()
}
})
println("output=$output")
}
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine
suspend fun addBonus(value: Int, bonus: Int): Int {
return value + bonus
}
suspend fun labelScore(score: Int): String {
return if (score >= 10) "ready:$score" else "waiting:$score"
}
fun main() {
val bonus =
var output = "pending"
val work: suspend () -> String = {
val first = addBonus(5, bonus)
val second = addBonus(first, 2)
labelScore(second)
}
work.startCoroutine(object : Continuation<String> {
override val context = EmptyCoroutineContext
override fun resumeWith(result: Result<String>) {
output = result.getOrThrow()
}
})
println("output=$output")
}
sequential suspend
Suspending functions can compose in sequence: each result feeds the next statement.