| // FILE: 1.kt | |
| interface Service { | |
| fun send(message: String): String | |
| } | |
| inline fun Service.decorate(crossinline decorate: (Service) -> Service): Service = | |
| object : Service by decorate(this) {} | |
| inline fun Service.transformMessage(crossinline transform: (String) -> String) = | |
| decorate { service -> | |
| object : Service { | |
| override fun send(message: String): String = | |
| service.send(transform(message)) | |
| } | |
| } | |
| // FILE: 2.kt | |
| fun Service.append(suffix: String): Service = | |
| transformMessage { it + suffix } | |
| fun box(): String = | |
| object : Service { | |
| override fun send(message: String): String = message | |
| }.append("K").send("O") |