{"version":3,"sources":["../src/eventBus.ts"],"sourcesContent":["type EventHandler<\n  Events extends Record<string, unknown>,\n  Key extends keyof Events,\n> = (payload: Events[Key]) => void;\n\ntype EventBus<Events extends Record<string, unknown>> = {\n  /**\n   * Subscribe to an event\n   *\n   * @param event - The event name to subscribe to\n   * @param handler - The callback function to execute when the event is dispatched\n   * @param opts - Optional configuration\n   * @param opts.notify - If true and the event was previously dispatched, handler will be called immediately with the latest payload\n   * @returns void\n   */\n  on: <Event extends keyof Events>(\n    event: Event,\n    handler: EventHandler<Events, Event>,\n    opts?: { notify?: boolean }\n  ) => void;\n\n  /**\n   * Publish an event with a payload\n   * Triggers all registered handlers for the event\n   *\n   * @param event - The event name to publish\n   * @param payload - The data to pass to event handlers\n   * @returns void\n   */\n  emit: <Event extends keyof Events>(\n    event: Event,\n    payload: Events[Event]\n  ) => void;\n  off: <Event extends keyof Events>(\n    event: Event,\n    handler?: EventHandler<Events, Event>\n  ) => void;\n  getListeners: <Event extends keyof Events>(\n    event: Event\n  ) => Array<(...args: any[]) => void>;\n};\n\n/**\n * @internal\n */\ntype InternalOn = <\n  Events extends Record<string, unknown>,\n  Event extends keyof Events,\n>(\n  eventToHandlersMap: Map<keyof Events, Array<(...args: any[]) => void>>,\n  latestPayloadMap: Map<keyof Events, any>,\n  event: Event,\n  handler: EventHandler<Events, Event>,\n  opts?: { notify?: boolean }\n) => void;\n\n/**\n * @internal\n */\ntype InternalOff = <\n  Events extends Record<string, unknown>,\n  Event extends keyof Events,\n>(\n  eventToHandlersMap: Map<keyof Events, Array<(...args: any[]) => void>>,\n  event: Event,\n  handler?: EventHandler<Events, Event>\n) => void;\n\n/**\n * @internal\n */\ntype InternalDispatch = <\n  Events extends Record<string, unknown>,\n  Event extends keyof Events,\n>(\n  eventToHandlersMap: Map<keyof Events, Array<(...args: any[]) => void>>,\n  event: Event,\n  payload: Events[Event]\n) => void;\n\n/**\n * @internal\n */\nconst _off: InternalOff = (eventToHandlersMap, event, handler) => {\n  const handlers = eventToHandlersMap.get(event);\n  if (handlers) {\n    if (handler) {\n      handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n    } else {\n      eventToHandlersMap.set(event, []);\n    }\n  }\n};\n\n/**\n * @internal\n */\nconst _on: InternalOn = (\n  eventToHandlersMap,\n  latestPayloadMap,\n  event,\n  handler,\n  opts\n) => {\n  const { notify } = opts || {};\n  let handlers = eventToHandlersMap.get(event);\n\n  if (!handlers) {\n    handlers = [];\n    eventToHandlersMap.set(event, handlers);\n  }\n\n  handlers.push(handler);\n  if (notify && latestPayloadMap.has(event)) {\n    handler(latestPayloadMap.get(event));\n  }\n};\n\n/**\n * @internal\n */\n\nconst _dispatch: InternalDispatch = (eventToHandlersMap, event, payload) =>\n  (eventToHandlersMap.get(event) || []).map((h) => h(payload));\n\nexport const createEventBus = <\n  Events extends Record<string, unknown>,\n>(): EventBus<Events> => {\n  const eventToHandlersMap = new Map<\n    keyof Events,\n    Array<(...args: any[]) => void>\n  >();\n  const latestPayloadMap = new Map<keyof Events, any>();\n  const eventToPredispatchHandlersMap = new Map<\n    keyof Events,\n    Array<(...args: any[]) => void>\n  >();\n\n  const emit: EventBus<Events>[\"emit\"] = (event, payload) => {\n    latestPayloadMap.set(event, payload);\n    _dispatch(eventToPredispatchHandlersMap, event, payload);\n    _dispatch(eventToHandlersMap, event, payload);\n  };\n\n  return {\n    on: (...args) => _on(eventToHandlersMap, latestPayloadMap, ...args),\n    emit,\n    off: (...args) => _off(eventToHandlersMap, ...args),\n    getListeners: (event) => eventToHandlersMap.get(event) || [],\n  };\n};\n"],"mappings":";AAmFA,IAAM,OAAoB,CAAC,oBAAoB,OAAO,YAAY;AAChE,QAAM,WAAW,mBAAmB,IAAI,KAAK;AAC7C,MAAI,UAAU;AACZ,QAAI,SAAS;AACX,eAAS,OAAO,SAAS,QAAQ,OAAO,MAAM,GAAG,CAAC;AAAA,IACpD,OAAO;AACL,yBAAmB,IAAI,OAAO,CAAC,CAAC;AAAA,IAClC;AAAA,EACF;AACF;AAKA,IAAM,MAAkB,CACtB,oBACA,kBACA,OACA,SACA,SACG;AACH,QAAM,EAAE,OAAO,IAAI,QAAQ,CAAC;AAC5B,MAAI,WAAW,mBAAmB,IAAI,KAAK;AAE3C,MAAI,CAAC,UAAU;AACb,eAAW,CAAC;AACZ,uBAAmB,IAAI,OAAO,QAAQ;AAAA,EACxC;AAEA,WAAS,KAAK,OAAO;AACrB,MAAI,UAAU,iBAAiB,IAAI,KAAK,GAAG;AACzC,YAAQ,iBAAiB,IAAI,KAAK,CAAC;AAAA,EACrC;AACF;AAMA,IAAM,YAA8B,CAAC,oBAAoB,OAAO,aAC7D,mBAAmB,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAEtD,IAAM,iBAAiB,MAEL;AACvB,QAAM,qBAAqB,oBAAI,IAG7B;AACF,QAAM,mBAAmB,oBAAI,IAAuB;AACpD,QAAM,gCAAgC,oBAAI,IAGxC;AAEF,QAAM,OAAiC,CAAC,OAAO,YAAY;AACzD,qBAAiB,IAAI,OAAO,OAAO;AACnC,cAAU,+BAA+B,OAAO,OAAO;AACvD,cAAU,oBAAoB,OAAO,OAAO;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,IAAI,IAAI,SAAS,IAAI,oBAAoB,kBAAkB,GAAG,IAAI;AAAA,IAClE;AAAA,IACA,KAAK,IAAI,SAAS,KAAK,oBAAoB,GAAG,IAAI;AAAA,IAClD,cAAc,CAAC,UAAU,mBAAmB,IAAI,KAAK,KAAK,CAAC;AAAA,EAC7D;AACF;","names":[]}