open class Subscription interface Observer { fun next(value: T) } open class Subscriber(observer: Observer? = null) : Subscription(), Observer { override fun next(value: T) {} } fun interface Subscribe { fun subscribe(subscriber: Subscriber): Subscription } fun interface Operator { fun call(source: Observable): Observable } open class Observable(private val subscribeFn: Subscribe) { fun apply(operator: Operator): Observable { return operator.call(this) } fun subscribe(observer: Observer): Subscription { return Subscription() } companion object { fun of(vararg elems: T): Observable { return Observable { Subscription() } } } }