| |
| // 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") |