object EventBus { val bus: BroadcastChannel = BroadcastChannel() fun send(o: Any) { launch { bus.send(o) } } inline fun asChannel(): ReceiveChannel { return bus.openSubscription().filter { it is T }.map { it as T } } } // To post an event: EventBus.send(SomeEvent()) // To subscribe to an event: var subscription = EventBus.asChannel() launch(UI) { subscription.consumeEach { event -> // Handles the event... } } // To cancel a subscriber: subscription.cancel()