44 lines
1.0 KiB
TypeScript
44 lines
1.0 KiB
TypeScript
// TODO: Seamless RxJs integration
|
|
// From RxJs: https://github.com/ReactiveX/rxjs/blob/master/src/Observer.ts
|
|
export interface Observer<T> {
|
|
closed?: boolean;
|
|
next: (value: T) => void;
|
|
error: (err: any) => void;
|
|
complete: () => void;
|
|
}
|
|
|
|
export interface Observable<T> {
|
|
// TODO: Return a Subscription so the caller can unsubscribe? IDisposable in System.IObservable
|
|
subscribe(observer: Observer<T>): void;
|
|
}
|
|
|
|
export class Subject<T> implements Observable<T> {
|
|
observers: Observer<T>[];
|
|
|
|
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<T>): void {
|
|
this.observers.push(observer);
|
|
}
|
|
}
|