startCoroutine runs a suspend lambda and reports its result through a continuation.

startCoroutine `startCoroutine` is a standard-library bridge from a suspend lambda to an explicit continuation callback.

Start Coroutine

input
StartCoroutine.kt
Replay: real traced execution (multi-file project)
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine

suspend fun doubleValue(value: Int): Int {
    return value * 2
}

fun main() {
    val input = 4
    val events = mutableListOf("created")

    val work: suspend () -> Int = {
        events.add("running")
        doubleValue(input)
    }

    work.startCoroutine(object : Continuation<Int> {
        override val context = EmptyCoroutineContext

        override fun resumeWith(result: Result<Int>) {
            events.add("resumed=${result.getOrThrow()}")
        }
    })

    println("events=" + events.joinToString(">"))
}
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine

suspend fun doubleValue(value: Int): Int {
    return value * 2
}

fun main() {
    val input = 2
    val events = mutableListOf("created")

    val work: suspend () -> Int = {
        events.add("running")
        doubleValue(input)
    }

    work.startCoroutine(object : Continuation<Int> {
        override val context = EmptyCoroutineContext

        override fun resumeWith(result: Result<Int>) {
            events.add("resumed=${result.getOrThrow()}")
        }
    })

    println("events=" + events.joinToString(">"))
}
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine

suspend fun doubleValue(value: Int): Int {
    return value * 2
}

fun main() {
    val input = 7
    val events = mutableListOf("created")

    val work: suspend () -> Int = {
        events.add("running")
        doubleValue(input)
    }

    work.startCoroutine(object : Continuation<Int> {
        override val context = EmptyCoroutineContext

        override fun resumeWith(result: Result<Int>) {
            events.add("resumed=${result.getOrThrow()}")
        }
    })

    println("events=" + events.joinToString(">"))
}
  1. input ← 4, events ← [created], work ← () -> kotlin.Int

    9fun main() {10    val input→ 4 = 4 //@input=2, 711    val events→ [created] = mutableListOf("created")1213    val work→ () -> kotlin.Int: suspend () -> Int = {14        events.add("running")15        doubleValue(input)16    }1718    work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19        override val context = EmptyCoroutineContext2021        override fun resumeWith(result: Result<Int>) {22            events.add("resumed=${result.getOrThrow()}")23        }24    })
  2. suspend fun doubleValue(value: Int): Int

    5suspend fun doubleValue(value4: Int): Int {6    return value4 * 27}
  3. override fun resumeWith(result: Result<Int>)

    18work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19    override val context = EmptyCoroutineContext2021    override fun resumeWith(resultSuccess(8): Result<Int>) {22        events[created, running].add("resumed=${resultSuccess(8).getOrThrow()}")23    }24})
  4. println("events=" + events.joinToString(">"))

    26    println("events=" + events[created, running, resumed=8].joinToString(">"))27}
    outputevents=created>running>resumed=8
  1. input ← 2, events ← [created], work ← () -> kotlin.Int

    9fun main() {10    val input→ 2 = 211    val events→ [created] = mutableListOf("created")1213    val work→ () -> kotlin.Int: suspend () -> Int = {14        events.add("running")15        doubleValue(input)16    }1718    work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19        override val context = EmptyCoroutineContext2021        override fun resumeWith(result: Result<Int>) {22            events.add("resumed=${result.getOrThrow()}")23        }24    })
  2. suspend fun doubleValue(value: Int): Int

    5suspend fun doubleValue(value2: Int): Int {6    return value2 * 27}
  3. override fun resumeWith(result: Result<Int>)

    18work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19    override val context = EmptyCoroutineContext2021    override fun resumeWith(resultSuccess(4): Result<Int>) {22        events[created, running].add("resumed=${resultSuccess(4).getOrThrow()}")23    }24})
  4. println("events=" + events.joinToString(">"))

    26    println("events=" + events[created, running, resumed=4].joinToString(">"))27}
    outputevents=created>running>resumed=4
  1. input ← 7, events ← [created], work ← () -> kotlin.Int

    9fun main() {10    val input→ 7 = 711    val events→ [created] = mutableListOf("created")1213    val work→ () -> kotlin.Int: suspend () -> Int = {14        events.add("running")15        doubleValue(input)16    }1718    work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19        override val context = EmptyCoroutineContext2021        override fun resumeWith(result: Result<Int>) {22            events.add("resumed=${result.getOrThrow()}")23        }24    })
  2. suspend fun doubleValue(value: Int): Int

    5suspend fun doubleValue(value7: Int): Int {6    return value7 * 27}
  3. override fun resumeWith(result: Result<Int>)

    18work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19    override val context = EmptyCoroutineContext2021    override fun resumeWith(resultSuccess(14): Result<Int>) {22        events[created, running].add("resumed=${resultSuccess(14).getOrThrow()}")23    }24})
  4. println("events=" + events.joinToString(">"))

    26    println("events=" + events[created, running, resumed=14].joinToString(">"))27}
    outputevents=created>running>resumed=14