import { Subscription, ListenerEvent, CombinedHandler } from '../../types'; export function EventEmitterCombined>( isActive: () => boolean ): EventEmitterCombinedInstance { let handlers: CombinedHandler[] = []; let queue: E[] = []; // merge events in queue into one event function solveQueue() { if (queue.length === 0) { return; } const queueCopy = queue; queue = []; handlers.forEach((handler) => { handler(queueCopy); }); } return Object.freeze({ listen(handler: (e: E[]) => void): Subscription { const handlerWrapper: CombinedHandler = (events) => { handler(events); }; handlers.push(handlerWrapper); return { unsubscribe() { handlers = handlers.filter((i) => handlerWrapper !== i); }, }; }, emit(e: E, delayed: boolean) { if (isActive()) { if (isActive()) { queue.push(e); if (!delayed) { solveQueue(); } else { setTimeout(solveQueue, 0); } } } }, }); } export type EventEmitterCombinedInstance> = { readonly listen: (handler: CombinedHandler) => Subscription; readonly emit: (e: E, delayed: boolean) => void; };