Skip to content

Instantly share code, notes, and snippets.

@0nko
Created July 29, 2017 16:10
Show Gist options
  • Save 0nko/8cede6e9897051dee8e042c359244831 to your computer and use it in GitHub Desktop.
Save 0nko/8cede6e9897051dee8e042c359244831 to your computer and use it in GitHub Desktop.
C#-style events in Kotlin
fun main(args: Array<String>) {
val duck = Duck()
duck.talked += { said -> println("Duck: $said") }
duck.poke()
}
class Event<T>(val eventHandler: EventHandler<T>) {
operator fun plusAssign(observer: (T) -> Unit) { eventHandler.observers.add(observer) }
operator fun minusAssign(observer: (T) -> Unit) { eventHandler.observers.remove(observer) }
}
class EventHandler<T> {
val observers = arrayListOf<((T) -> Unit)>()
operator fun invoke(value: T) { for (observer in observers) { observer(value) } }
}
class Duck {
private val onTalk = EventHandler<String>()
val talked = Event<String>(onTalk)
fun poke() {
onTalk("Quaak!")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment