UNPKG

@toolpad/utils

Version:

Shared utilities used by Toolpad packages.

1 lines 3.17 kB
{"version":3,"sources":["../src/events.ts"],"sourcesContent":["export type EventName = string | symbol;\n\nexport type EventHandlers = Record<EventName, unknown>;\n\nexport type EventHandler<T extends EventHandlers, K extends keyof T = keyof T> = (\n event: T[K],\n) => void;\n\nexport type AllEventsHandler<T extends EventHandlers, K extends keyof T = keyof T> = (\n type: K,\n event: T[K],\n) => void;\n\n/**\n * Lightweight event emitter\n */\nexport class Emitter<T extends EventHandlers = {}> {\n private handlers = new Map<keyof T, Set<EventHandler<T> | AllEventsHandler<T>>>();\n\n /**\n * Add a listener for an event\n */\n on(name: '*', handler: AllEventsHandler<T>): void;\n on<K extends keyof T>(name: K, handler: EventHandler<T, K>): void;\n on<K extends keyof T>(name: K | '*', handler: EventHandler<T, K> | AllEventsHandler<T>): void {\n let eventHandlers = this.handlers.get(name);\n if (!eventHandlers) {\n eventHandlers = new Set();\n this.handlers.set(name, eventHandlers);\n }\n eventHandlers.add(handler as EventHandler<T> | AllEventsHandler<T>);\n }\n\n /**\n * Remove a listener from an event\n */\n off<K extends keyof T>(name: K, handler: EventHandler<T, K>) {\n const eventHandlers = this.handlers.get(name);\n if (eventHandlers) {\n eventHandlers.delete(handler as EventHandler<T> | AllEventsHandler<T>);\n if (eventHandlers.size <= 0) {\n this.handlers.delete(name);\n }\n }\n }\n\n /**\n * Subscribe to an event and return an unsubscribe function.\n */\n subscribe<K extends keyof T>(name: K, handler: EventHandler<T, K>) {\n this.on(name, handler);\n return () => {\n this.off(name, handler);\n };\n }\n\n /**\n * Emit an event.\n */\n emit<K extends keyof T>(name: K, event: T[K]) {\n const eventHandlers = this.handlers.get(name);\n if (eventHandlers) {\n for (const eventHandler of eventHandlers) {\n (eventHandler as EventHandler<T, K>)(event);\n }\n }\n const allHandlers = this.handlers.get('*');\n if (allHandlers) {\n for (const eventHandler of allHandlers) {\n (eventHandler as AllEventsHandler<T>)(name, event);\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,IAAM,UAAN,MAA4C;AAAA,EAA5C;AACL,SAAQ,WAAW,oBAAI,IAAyD;AAAA;AAAA,EAOhF,GAAsB,MAAe,SAAyD;AAC5F,QAAI,gBAAgB,KAAK,SAAS,IAAI,IAAI;AAC1C,QAAI,CAAC,eAAe;AAClB,sBAAgB,oBAAI,IAAI;AACxB,WAAK,SAAS,IAAI,MAAM,aAAa;AAAA,IACvC;AACA,kBAAc,IAAI,OAAgD;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAuB,MAAS,SAA6B;AAC3D,UAAM,gBAAgB,KAAK,SAAS,IAAI,IAAI;AAC5C,QAAI,eAAe;AACjB,oBAAc,OAAO,OAAgD;AACrE,UAAI,cAAc,QAAQ,GAAG;AAC3B,aAAK,SAAS,OAAO,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAA6B,MAAS,SAA6B;AACjE,SAAK,GAAG,MAAM,OAAO;AACrB,WAAO,MAAM;AACX,WAAK,IAAI,MAAM,OAAO;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAwB,MAAS,OAAa;AAC5C,UAAM,gBAAgB,KAAK,SAAS,IAAI,IAAI;AAC5C,QAAI,eAAe;AACjB,iBAAW,gBAAgB,eAAe;AACxC,QAAC,aAAoC,KAAK;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,cAAc,KAAK,SAAS,IAAI,GAAG;AACzC,QAAI,aAAa;AACf,iBAAW,gBAAgB,aAAa;AACtC,QAAC,aAAqC,MAAM,KAAK;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF;","names":[]}