import { checkObservable } from "../_check" import { InvokeableWithParam, invokeWith, Source, Subscriber, Subscription } from "../_core" import { makeEventStream } from "../_obs" import { EventStream, isEventStream } from "../EventStream" import { dispatcherOf, Observable } from "../Observable" import { Property } from "../Property" import { scheduleActivationTask } from "../scheduler/index" import { Identity } from "./_base" export function toEventStream( observable: Observable, ): EventStream { checkObservable(observable) return isEventStream(observable) ? observable : makeEventStream(new ToEventStream(dispatcherOf(observable as Property))) } export class ToEventStream extends Identity { constructor(source: Source) { super(source) } public subscribe(subscriber: Subscriber, order: number): Subscription { return new ToEventStreamSubscription(this, super.subscribe(subscriber, order)) } public activate(initialNeeded: boolean): void { if (this.active) { this.subs.activate(initialNeeded) } } } class ToEventStreamSubscription implements Subscription, InvokeableWithParam { private d: boolean = false constructor(private tos: ToEventStream, private s: Subscription) {} public activate(initialNeeded: boolean): void { scheduleActivationTask(invokeWith(this, initialNeeded)) } public invoke(initialNeeded: boolean): void { !this.d && this.tos.activate(initialNeeded) } public dispose(): void { this.d = true this.s.dispose() } public reorder(order: number): void { this.s.reorder(order) } }