| // WITH_COROUTINES |
| // NO_CHECK_LAMBDA_INLINING |
| // WITH_STDLIB |
| |
| // FILE: inlined.kt |
| |
| interface Flow<out T> { |
| suspend fun collect(collector: FlowCollector<T>) |
| } |
| |
| interface FlowCollector<in T> { |
| suspend fun emit(value: T) |
| } |
| |
| inline suspend fun <T> Flow<T>.collect(crossinline action: suspend (value: T) -> Unit): Unit = |
| collect(object : FlowCollector<T> { |
| override suspend fun emit(value: T) = action(value) |
| }) |
| |
| inline fun <T, R> Flow<T>.transform( |
| crossinline transform: suspend FlowCollector<R>.(value: T) -> Unit |
| ): Flow<R> = flow { |
| collect { value -> |
| return@collect transform(value) |
| } |
| } |
| |
| inline fun <T, R> Flow<T>.map(crossinline transform: suspend (value: T) -> R): Flow<R> = transform { value -> |
| return@transform emit(transform(value)) |
| } |
| |
| public fun <T> flow(block: suspend FlowCollector<T>.() -> Unit): Flow<T> = SafeFlow(block) |
| |
| private class SafeFlow<T>(private val block: suspend FlowCollector<T>.() -> Unit) : Flow<T> { |
| override suspend fun collect(collector: FlowCollector<T>) { |
| collector.block() |
| } |
| } |
| |
| // FILE: inlineSite.kt |
| import kotlin.coroutines.* |
| import helpers.* |
| |
| fun Flow<String>.abc() = map { line -> |
| try { |
| line |
| } catch (e: Exception) { |
| e.message!! |
| } |
| } |
| |
| fun builder(c: suspend () -> Unit) { |
| c.startCoroutine(EmptyContinuation) |
| } |
| |
| fun box(): String { |
| var res = "FAIL" |
| builder { |
| flow<String> { |
| emit("OK") |
| }.abc().collect { |
| res = it |
| } |
| } |
| return res |
| } |