import { IBus } from "./base"; export interface IObservableBus extends IBus { observe(listener: IBus); unobserve(listener: IBus); } export class ObservableBus implements IObservableBus { private _observers: IBus[]; private _messageBus: IBus; constructor() { this._messageBus = this.createMessageBus(this._observers = []); } protected createMessageBus(observers: IBus[]): IBus { return { dispatch: (message) => { for (let i = observers.length; i--;) { observers[i].dispatch(message); } } } } observe(listener: IBus) { this._observers.push(listener); } unobserve(listener: IBus) { const index = this._observers.indexOf(listener); if (index !== -1) this._observers.splice(index, 1); } dispatch(message: any) { return this._messageBus.dispatch(message); } }