class ObservableBus(cacheCount: Int = 0) { private val subject: SerializedSubject, Observable> = PublishSubject>().toSerialized() private val live: MutableSet> = ConcurrentHashMap.newKeySet>() private val observable = subject.flatMap { obs: Observable -> obs.takeWhile { live.contains(obs) } } .observeOnFx().let { if (cacheCount > 0) it.cacheWithInitialCapacity(cacheCount) else it } fun toObservable(): Observable = observable operator fun plusAssign(observable: Observable) = add(observable) operator fun minusAssign(observable: Observable) = remove(observable) fun add(observable: Observable) { live.add(observable) subject.onNext(observable) } fun remove(observable: Observable) { live.remove(observable) } }