// FILE: 1.kt class My inline fun T.perform(job: (T)-> R) : R { return job(this) } inline fun My.someWork(job: (String) -> Any): Unit { this.perform { job("OK") } } inline fun My.doWork (closure : (param : String) -> Unit) : Unit { this.someWork(closure) } inline fun My.doPerform (closure : (param : My) -> Int) : Int { return perform(closure) } // FILE: 2.kt fun test1(): String { val inlineX = My() var d = ""; inlineX.doWork({ z: String -> d = z; z}) return d } fun test2(): Int { val inlineX = My() return inlineX.perform({ z: My -> 11}) } fun box(): String { if (test1() != "OK") return "test1: ${test1()}" if (test2() != 11) return "test1: ${test2()}" return "OK" }