| // WITH_STDLIB | |
| // FILE: lib.kt | |
| import kotlin.coroutines.* | |
| interface Flow<out T> { | |
| suspend fun collect(collector: FlowCollector<T>) | |
| } | |
| interface FlowCollector<in T> { | |
| suspend fun emit(value: T) | |
| } | |
| suspend inline fun <T> Flow<T>.collect(crossinline action: suspend (value: T) -> Unit): Unit = | |
| collect(object : FlowCollector<T> { | |
| override suspend fun emit(value: T) = action(value) | |
| }) | |
| // FILE: main.kt | |
| import kotlin.coroutines.* | |
| fun builder(c: suspend () -> Unit) { | |
| c.startCoroutine(Continuation(EmptyCoroutineContext) { | |
| it.getOrThrow() | |
| }) | |
| } | |
| fun box(): String { | |
| val flow: Flow<Result<String>> = object : Flow<Result<String>> { | |
| override suspend fun collect(collector: FlowCollector<Result<String>>) { | |
| collector.emit(Result.success("OK")) | |
| } | |
| } | |
| var res = "FAIL" | |
| builder { | |
| flow.collect { result -> | |
| result.onSuccess { text -> | |
| res = text | |
| } | |
| } | |
| } | |
| return res | |
| } |