import { Subscription, Listener } from '../../types'; export function EventEmitter( isActive: () => boolean ): EventEmitterInstance { let handlers: Listener[] = []; return Object.freeze({ listen(handler: Listener): Subscription { const handlerWrapper: Listener = (e) => { handler(e); }; handlers.push(handlerWrapper); return { unsubscribe() { handlers = handlers.filter((i) => handlerWrapper !== i); }, }; }, emit(data: T) { if (isActive()) { handlers.forEach((handler) => handler({ value: data })); } }, }); } export type EventEmitterInstance = { readonly listen: (handler: Listener) => Subscription; readonly emit: (data: T) => void; };