// TODO: Seamless RxJs integration // From RxJs: https://github.com/ReactiveX/rxjs/blob/master/src/Observer.ts export interface Observer { closed?: boolean; next: (value: T) => void; error: (err: any) => void; complete: () => void; } export interface Observable { // TODO: Return a Subscription so the caller can unsubscribe? IDisposable in System.IObservable subscribe(observer: Observer): void; } export class Subject implements Observable { observers: Observer[]; constructor() { this.observers = []; } public next(item: T): void { for (let observer of this.observers) { observer.next(item); } } public error(err: any): void { for (let observer of this.observers) { observer.error(err); } } public complete(): void { for (let observer of this.observers) { observer.complete(); } } public subscribe(observer: Observer): void { this.observers.push(observer); } }