{"version":3,"sources":["../capillaries.ts","../src/Events.ts","../src/Hooks.ts","../src/AsyncEvents.ts"],"sourcesContent":["import Events from './src/Events';\n\nexport { default as Events } from './src/Events';\nexport { default as Hooks } from './src/Hooks';\nexport { default as AsyncEvents } from './src/AsyncEvents';\n\nexport default Events;\n","type Listener<E, K extends keyof E> = (...payload: E[K][]) => void;\ntype WildcardListener<E> = <K extends keyof E>(type: K, ...payload: E[K][]) => void;\n\nclass Events<E extends Record<string | symbol | '*', unknown>> {\n  #events = new Map<keyof E | '*', [Function, unknown][]>();\n\n  constructor() {\n    Object.freeze(this);\n  }\n\n  /**\n   * Create event listener\n   *\n   * @param type A String that specifies the name of the event.\n   * @param listener A function to invoke when the event occurs.\n   * @param context Context to bind to the event handler\n   *\n   * @returns {Function} A function to unsubscribe the listener\n   */\n  on: {\n    (type: '*', listener: WildcardListener<E>, context?: unknown): () => void;\n    <K extends keyof E>(type: K, listener: Listener<E, K>, context?: unknown): () => void;\n  } = <K extends keyof E>(type: K | '*', listener: Function, context: unknown = null): (() => void) => {\n    if (typeof listener !== 'function') {\n      throw new TypeError('Event Listener must be a function');\n    }\n\n    const event = this.#events.get(type) ?? [];\n    event.push([listener, context]);\n    this.#events.set(type, event);\n\n    return () => {\n      const events = this.#events.get(type) ?? [];\n      this.#events.set(\n        type,\n        events.filter((e) => e[0] !== listener),\n      );\n    };\n  };\n\n  /**\n   * Emit Events\n   * @param type A String that specifies the name of the event.\n   * @param payload Optional payload for event handlers\n   */\n  emit = <K extends keyof E>(type: K, ...args: E[K][]): void => {\n    const events = this.#events.get(type) ?? [];\n\n    events.forEach((event) => {\n      const [listenerFn, ctx] = event;\n      listenerFn.apply(ctx, args);\n    });\n\n    if (type === '*') {\n      return;\n    }\n\n    const wildcardEvents = this.#events.get('*') ?? [];\n    wildcardEvents.forEach((event) => {\n      const [listenerFn, ctx] = event;\n      listenerFn.apply(ctx, [type, ...args]);\n    });\n  };\n\n  /**\n   * Unbind all events listeners\n   *\n   * @param type A String that specifies the name of the event. If not specified it will clear all events\n   */\n  unbindAll = <K extends keyof E>(type?: K): void => {\n    if (type !== undefined) {\n      this.#events.delete(type);\n      return;\n    }\n\n    this.#events.clear();\n  };\n}\n\nexport default Events;\n","class Hooks<H extends Record<string, unknown>> {\n  #hooks = new Map<keyof H | '*', [Function, unknown][]>();\n\n  constructor() {\n    Object.freeze(this);\n  }\n\n  /**\n   * Create a tap\n   *\n   * @param name Name of the hook\n   * @param cb A callback function to invoke when the hook is called\n   * @param ctx Context to bind to the callback function\n   *\n   * @returns {Function} A function to remove the tap\n   */\n  tap = <K extends keyof H>(name: K, cb: (payload: H[K]) => void, ctx: unknown = null): (() => void) => {\n    if (typeof cb !== 'function') {\n      throw new TypeError('Callback must be a function');\n    }\n\n    const hooks = this.#hooks.get(name) ?? [];\n    hooks.push([cb, ctx]);\n    this.#hooks.set(name, hooks);\n\n    return () => {\n      const currentHooks = this.#hooks.get(name) ?? [];\n      this.#hooks.set(\n        name,\n        currentHooks.filter(([hook]) => hook !== cb),\n      );\n    };\n  };\n\n  /**\n   * Invokes and awaits on all tapped functions asynchronously\n   *\n   * @param name Name of the hook\n   * @param args Payload for the hook\n   */\n  callAsync = async <K extends keyof H>(name: K, ...args: H[K][]): Promise<void> => {\n    const hooks = this.#hooks.get(name);\n    if (!hooks) {\n      return;\n    }\n\n    for (const [hook, ctx] of hooks) {\n      await hook.apply(ctx, args);\n    }\n  };\n\n  /**\n   * Invokes all tapped functions asynchronously in series\n   * The result from one tap is passed to the next, returning the result from the last tap\n   *\n   * @param name Name of the hook\n   * @param arg Initial payload for the hooks\n   * @returns {Promise<unknown>} Result from the last hook\n   */\n  callAsyncWaterFall = async <K extends keyof H>(name: K, arg?: H[K]): Promise<unknown> => {\n    let data = arg;\n\n    const hooks = this.#hooks.get(name);\n    if (!hooks) {\n      return data;\n    }\n\n    for (const [hook, ctx] of hooks) {\n      data = await hook.call(ctx, data);\n    }\n\n    return data;\n  };\n\n  /**\n   * Invokes all tapped functions synchronously\n   *\n   * @param name Name of the hook\n   * @param arg Payload for the hook\n   */\n  call = <K extends keyof H>(name: K, arg?: H[K]): void => {\n    const hooks = this.#hooks.get(name);\n    if (!hooks) {\n      return;\n    }\n\n    for (const [hook, ctx] of hooks) {\n      hook.call(ctx, arg);\n    }\n  };\n\n  /**\n   * Invokes all tapped functions synchronously in series\n   * The result from one tap is passed to the next, returning the result from the last tap\n   *\n   * @param name Name of the hook\n   * @param arg Initial payload for the hooks\n   * @returns {unknown} Result from the last hook\n   */\n  callWaterFall = <K extends keyof H>(name: K, arg?: H[K]): unknown => {\n    let data = arg;\n\n    const hooks = this.#hooks.get(name);\n    if (!hooks) {\n      return data;\n    }\n\n    for (const [hook, ctx] of hooks) {\n      data = hook.call(ctx, data);\n    }\n\n    return data;\n  };\n\n  /**\n   * Remove all hooks or hooks for a specific name\n   *\n   * @param name Optional name of the hook to remove. If not specified, all hooks are cleared\n   */\n  clear = <K extends keyof H>(name?: K): void => {\n    if (typeof name !== 'undefined') {\n      this.#hooks.delete(name);\n    } else {\n      this.#hooks.clear();\n    }\n  };\n}\n\nexport default Hooks;\n","class AsyncEvents<E extends Record<string, unknown>> {\n  #events = new Map<keyof E, (...payload: any[]) => Promise<void>>();\n\n  /**\n   * Create event listener\n   *\n   * @param name A String that specifies the name of the event.\n   * @param handler A function to invoke when the event is invoked.\n   *\n   * @returns {Function} A function to unsubscribe the listener\n   */\n  on = <K extends keyof E>(name: K, handler: (...payload: E[K][]) => Promise<void>): (() => void) => {\n    if (this.#events.has(name)) {\n      throw new Error(`Handler already exists for event: ${String(name)}`);\n    }\n\n    if (typeof handler !== 'function') {\n      throw new TypeError(`Expected handler to be a function, but got: ${typeof handler}`);\n    }\n\n    this.#events.set(name, handler);\n\n    return () => this.#events.delete(name);\n  };\n\n  /**\n   * Invokes the handler function asynchronously\n   *\n   * @param name Name of the event\n   * @param payload Payload for the handler\n   *\n   * @returns {Promise<void>} A promise that resolves when the handler completes\n   */\n  call = <K extends keyof E>(name: K, ...payload: E[K][]): Promise<void> => {\n    const handler = this.#events.get(name);\n\n    if (!handler) {\n      throw new Error(`No handler registered for event: ${String(name)}`);\n    }\n\n    return handler(...payload);\n  };\n\n  /**\n   * Unbind all event listeners\n   *\n   * @param name A String that specifies the name of the event. If not specified, it will clear all events\n   */\n  unbindAll = <K extends keyof E>(name?: K): void => {\n    if (typeof name !== 'undefined') {\n      this.#events.delete(name);\n    } else {\n      this.#events.clear();\n    }\n  };\n}\n\nexport default AsyncEvents;\n"],"mappings":"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","names":["_a","_a","_events"]}