컨티뉴에이션 전달 방식

ex)
suspend fun getUser(): User?
suspend fun setUser(user: User)

// 중단 함수의 내부를 보면 선언한 타입과 리턴 타입이 다름.
fun getUser(continuation: Continuation<*>): Any?
fun setUser(user: User, continuation: Continuation<*>): Any

아주 간단한 함수

suspend fun myFuntion() {
		println("Before")
		delay(1000) // 중단 함수
		println("After")
}

myFuntion 함수는 다음과 같이 추론할 수 있음.

fun myFunction(continuation: Continuation<*>): Any
ex) 설명을 위해 이름을 붙임. 기존 컨티뉴에이션 객체는 익명객체임.
val continuation = 
		if (continuation is MyContinuation) continuation
		else MyContinuation(continuation)
suspend fun myFunction() {
		println("Before")
		delay(1000) // 중단 함수
		println("After")
}

fun myFunction() {
    val continuation = continuation as? MyFunctionContinuation ?: MyFunctionContinuation(continuation)
    
    if (continuation.label == 0) { // 함수가 처음 시작
        println("Before")
        continuation.label = 1 // 중단되기 전 다음 상태 설정
        if (delay(1000, continuation) == COROUTINE_SUSPEND) {
            return COROUTINE_SUSPEND
        }
    }
    
    if (continuation.label == 1) {
        println("After")
        return Unit
    }
    error("Impossible")
}