import type { Callback, CallbackFn, CallbackId, CallbackStore } from './types'; /** * @ignore */ export class Callbacks { private readonly store: CallbackStore; constructor(store: CallbackStore) { this.store = store; } public getFrom(key: string): Callback[] { return this.store[key] ?? []; } public addTo(key: string, callbackFn: CallbackFn): CallbackId { const callback: Callback = { id: Date.now().toString(), fn: callbackFn }; this.store[key] = [...this.getFrom(key), callback]; return callback.id; } public removeByCallbackFunctionFrom( key: string, callbackFn: CallbackFn, ): void { this.store[key] = this.getFrom(key).filter( (callback: Callback) => callback.fn !== callbackFn, ); } public removeByCallbackIdFrom(key: string, callbackId?: CallbackId): void { if (!callbackId) { return; } this.store[key] = this.getFrom(key).filter( (callback: Callback) => callback.id !== callbackId, ); } public executeFor(key: string, payload: any): void { this.getFrom(key).forEach((callback: Callback) => { callback.fn(payload); }); } }