import { Subscription, Handler, ListenerEvent } from '../../types'; export const EventEmitter = >( type: Event['type'], isActive: () => boolean ): EventEmitterInstance => { let handlers: Handler[] = []; return { listen(handler: (e: Event) => void): Subscription { const handlerWrapper: Handler = (e) => { handler(e); }; handlers.push(handlerWrapper); return { unsubscribe() { handlers = handlers.filter((i) => handlerWrapper !== i); }, }; }, emit(data: Event['value']) { if (isActive()) { handlers.forEach((handler) => handler({ type: type, value: data } as Event) ); } }, } as unknown as EventEmitterInstance; }; export type EventEmitterInstance = Event extends ListenerEvent ? { readonly listen: ( handler: Handler> ) => Subscription; readonly emit: (data: T) => void; } : never;