| // TARGET_BACKEND: JS_IR, JS_IR_ES6 |
| |
| // FILE: lib.kt |
| typealias Callback = () -> Unit |
| |
| class CallbackComposer { |
| inline fun addTo(noinline block: Callback) { |
| asDynamic().push(block) |
| } |
| } |
| |
| inline fun CallbackComposer.addToExtension(noinline block: Callback) { |
| asDynamic().push(block) |
| } |
| |
| // FILE: main.kt |
| fun createCallbackBuilder(builder: CallbackComposer.() -> Unit): () -> Callback = { |
| val callbacks = arrayOf<Callback>() |
| builder(callbacks.unsafeCast<CallbackComposer>()) |
| |
| val composed: Callback = { |
| for (cb in callbacks) { |
| cb() |
| } |
| } |
| composed |
| } |
| |
| var retVal = "" |
| |
| fun appendToRetVal(c: String): () -> Unit = { |
| retVal += c |
| } |
| |
| fun box(): String { |
| val callbackBuilder = createCallbackBuilder { |
| appendToRetVal("O").also(::addTo) |
| appendToRetVal("K").also(::addToExtension) |
| } |
| |
| val callback = callbackBuilder() |
| callback() |
| |
| return retVal |
| } |