| // WITH_STDLIB | |
| @file:OptIn(kotlin.experimental.ExperimentalTypeInference::class) | |
| interface Flow<out T> { | |
| fun collect(collector: FlowCollector<T>) | |
| } | |
| interface FlowCollector<in T> { | |
| fun emit(value: T) | |
| } | |
| fun <T> flow(block: FlowCollector<T>.() -> Unit): Flow<T> = | |
| object : Flow<T> { | |
| override fun collect(collector: FlowCollector<T>) = collector.block() | |
| } | |
| fun <T> Flow<T>.collect(action: (value: T) -> Unit): Unit = | |
| collect(object : FlowCollector<T> { | |
| override fun emit(value: T) = action(value) | |
| }) | |
| fun <T, R> Flow<T>.transform(transform: FlowCollector<R>.(T) -> Unit): Flow<R> = | |
| flow { collect { transform(it) } } | |
| fun <T, R> Flow<T>.map(transform: (T) -> R): Flow<R> = | |
| transform { emit(transform(it)) } | |
| var result: Any? = "not null" | |
| fun main1() { | |
| flow<Int> { emit(1) }.map { null }.collect { result = it } | |
| } | |
| fun box(): String { | |
| main1() | |
| return if (result == null) "OK" else "fail: $result" | |
| } |