{"version":3,"sources":["../src/library/EventManager.ts"],"sourcesContent":["import { Event } from \"./Event\";\n\n// type StringKeys = Extract<keyof Events, string>\nexport class EventManager<Events> {\n\tprotected eventHandlers: Record<\n\t\tstring,\n\t\t// TODO fix keyof Events type\n\t\t// @ts-ignore\n\t\tArray<(event: Event<keyof Events, Events[keyof Events]>) => void>\n\t>;\n\n\tconstructor() {\n\t\tthis.eventHandlers = {};\n\t}\n\n\tprotected getEventHandlers<EventName extends keyof Events>(\n\t\teventName: EventName & string\n\t): Array<(event: Event<EventName & string, Events[EventName]>) => void> {\n\t\tlet eventHandlers = this.eventHandlers[eventName];\n\n\t\tif (eventHandlers === undefined) {\n\t\t\teventHandlers = [];\n\t\t\tthis.eventHandlers[eventName] = eventHandlers;\n\t\t}\n\n\t\treturn eventHandlers;\n\t}\n\n\t/**\n\t * Adds an event handler for a pre-defined event.\n\t *\n\t * @param {EventName} eventName - The name of the event, will match the key of the specific event.\n\t * @param {(event: Event<EventName, Events[EventName]>) => void} handler - The handler function to be called when the event is triggered.\n\t */\n\tpublic on<EventName extends keyof Events>(\n\t\teventName: EventName & string,\n\t\thandler: (event: Event<EventName & string, Events[EventName]>) => void\n\t): void {\n\t\tlet eventHandlers = this.getEventHandlers(eventName);\n\t\teventHandlers.push(handler);\n\t}\n\n\t/**\n\t * Removes an event handler for a pre-defined event.\n\t *\n\t * @param {EventName} eventName - The name of the event, will match the key of the specific event.\n\t * @param {(event: Event<EventName, Events[EventName]>) => void} handler - The handler function instance to be removed.\n\t */\n\tpublic off<EventName extends keyof Events>(\n\t\teventName: EventName & string,\n\t\thandler: (event: Event<EventName & string, Events[EventName]>) => void\n\t) {\n\t\tlet eventHandlers = this.getEventHandlers(eventName);\n\t\teventHandlers.splice(eventHandlers.indexOf(handler), 1);\n\t}\n\n\t/**\n\t * Triggers a pre-defined event.\n\t *\n\t * @param {Event<EventName, Events[EventName]>} event - The event to be triggered.\n\t */\n\tpublic trigger<EventName extends keyof Events>(\n\t\tevent: Event<EventName & string, Events[EventName]>\n\t): void {\n\t\tfor (let handler of this.getEventHandlers(event.eventName)) {\n\t\t\thandler(event);\n\t\t}\n\t}\n\n\t/**\n\t * Checks if there are any handlers registered for a specific event.\n\t * Useful for performance optimization - skip event data preparation if no handlers exist.\n\t *\n\t * @param {EventName} eventName - The name of the event to check.\n\t * @returns {boolean} True if handlers are registered, false otherwise.\n\t */\n\tpublic hasEventHandlers<EventName extends keyof Events>(\n\t\teventName: EventName & string\n\t): boolean {\n\t\tconst handlers = this.eventHandlers[eventName];\n\t\treturn handlers !== undefined && handlers.length > 0;\n\t}\n}\n"],"mappings":";AAGO,IAAM,eAAN,MAA2B;AAAA,EACvB;AAAA,EAOV,cAAc;AACb,SAAK,gBAAgB,CAAC;AAAA,EACvB;AAAA,EAEU,iBACT,WACuE;AACvE,QAAI,gBAAgB,KAAK,cAAc,SAAS;AAEhD,QAAI,kBAAkB,QAAW;AAChC,sBAAgB,CAAC;AACjB,WAAK,cAAc,SAAS,IAAI;AAAA,IACjC;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,GACN,WACA,SACO;AACP,QAAI,gBAAgB,KAAK,iBAAiB,SAAS;AACnD,kBAAc,KAAK,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,IACN,WACA,SACC;AACD,QAAI,gBAAgB,KAAK,iBAAiB,SAAS;AACnD,kBAAc,OAAO,cAAc,QAAQ,OAAO,GAAG,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QACN,OACO;AACP,aAAS,WAAW,KAAK,iBAAiB,MAAM,SAAS,GAAG;AAC3D,cAAQ,KAAK;AAAA,IACd;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,iBACN,WACU;AACV,UAAM,WAAW,KAAK,cAAc,SAAS;AAC7C,WAAO,aAAa,UAAa,SAAS,SAAS;AAAA,EACpD;AACD;","names":[]}