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.