import {ExtendedSignal} from './extended-signal'; import {ReadableSignal} from './index'; import {Listener, WritableSignal} from './interfaces'; export class Signal extends ExtendedSignal implements WritableSignal, ReadableSignal { public static setDefaultListener(listener: Listener) { Signal._staticDefaultListener = listener; } private static _staticDefaultListener: Listener = () => { // default static listener is a noop } protected _listeners = new Set>(); constructor() { super({ add: listener => { this._listeners.add(listener); }, remove: listener => { this._listeners.delete(listener); }, }); } public dispatch(payload: T): void { if (this._listeners.size === 0) { const instanceDefaultListener = this._instanceDefaultListener; instanceDefaultListener(payload); return; } this._listeners.forEach(callback => callback.call(undefined, payload)); } public setDefaultListener(listener: Listener) { this._instanceDefaultListener = listener; } private _instanceDefaultListener: Listener = payload => Signal._staticDefaultListener(payload) }