{"version":3,"file":"typescript-package-events.mjs","sources":["../../../package/events/src/lib/listeners.class.ts","../../../package/events/src/lib/event-emitter.class.ts","../../../package/events/src/public-api.ts","../../../package/events/src/typescript-package-events.ts"],"sourcesContent":["/**\n * @description A class that manages a collection of listeners for events.\n * @export\n * @class Listeners\n * @template {(...args: any[]) => void} Listener \n */\nexport class Listeners<Listener extends (...args: any[]) => void> {\n  /**\n   * @description Privately stored listeners.\n   * @type {Set<Listener>}\n   */\n  #listeners: Set<Listener> = new Set();\n\n  /**\n   * @description Privately stored state of pause.\n   * @type {boolean}\n   */\n  #paused = false;\n\n  /**\n   * Creates an instance of `Listeners`.\n   * @constructor\n   * @param {...Listener[]} listeners The listeners to add.\n   */\n  constructor(...listeners: Listener[]) {\n    listeners?.forEach(listener => this.add(listener));\n  }\n\n  /**\n   * @description Adds a listener.\n   * @public\n   * @param {Listener} listener \n   */\n  public add(listener: Listener, { once }: { once: boolean} = { once: false }): this {\n    const listenerOnce = ((...args: Parameters<Listener>) => {\n      this.delete(listenerOnce as Listener);\n      listener(...args);\n    }) as Listener;\n    return this.#listeners.add(once ? listenerOnce : listener), this;\n  }\n\n  /**\n   * @description Removes a listener.\n   * @public\n   * @param {Listener} listener \n   * @returns this\n   */\n  public delete(listener: Listener): this {\n    return this.#listeners.delete(listener), this;\n  }\n\n  /**\n   * @description Removes all listeners.\n   * @public\n   * @returns this\n   */\n  public clear(): this {\n    return this.#listeners.clear(), this;\n  }\n\n  /**\n   * @description Gets the current number of listeners.\n   * @public\n   * @returns {number} \n   */\n  public count(): number {\n    return this.#listeners.size;\n  }\n\n  /**\n   * @description Emits an event to all listeners.\n   * @public\n   * @param {...Parameters<Listener>} args \n   */\n  public emit(...args: Parameters<Listener>): this {\n    if (this.#paused) return this;\n    const errors: any[] = [];\n    for (const listener of this.#listeners) {\n      try {\n        listener(...args);\n      } catch (error) {\n        errors.push(error);\n      }\n    }\n    if (errors.length) {\n      throw new AggregateError(errors, \"One or more listeners failed\");\n    }\n    return this;\n  }\n\n  /**\n   * @description Emit an event to all listeners asynchronously.\n   * @public\n   * @async\n   * @param {...Parameters<Listener>} args \n   * @returns {*} \n   */\n  public async emitAsync(...args: Parameters<Listener>) {\n    if (this.#paused) return this;\n    for (const listener of this.#listeners) {\n      await Promise.resolve(listener(...args));\n    }\n    return this;\n  }\n\n  /**\n   * @description Adds listener invoked once.\n   * @public\n   * @param {Listener} listener \n   * @returns {this} \n   */\n  public once(listener: Listener): this {\n    return this.add(listener, { once: true });\n  }\n\n  /**\n   * @description Pauses emitting.\n   * @public\n   */\n  public pause(): this { return this.#paused = true, this; }\n\n  /**\n   * @description Resume emitting.\n   * @public\n   */\n  public resume(): this { return this.#paused = false, this; }\n\n  /**\n   * @description Returns a snapshot of listeners.\n   * @public\n   * @returns {Listener[]} \n   */\n  public snapshot(): Listener[] {\n    return Array.from(this.#listeners);\n  }\n}\n","// Class.\nimport { Listeners } from \"./listeners.class\";\n/**\n * @description A class that implements an event emitter pattern.\n * @export\n * @class EventEmitter\n * @template {Record<string, (...args: any[]) => void>} Events \n */\nexport class EventEmitter<Events extends Record<string, (...args: any[]) => void>> {\n  /**\n   * @description\n   * @type {Map<keyof Events, Listeners<Events[keyof Events]>>}\n   */\n  #events: Map<keyof Events, Listeners<Events[keyof Events]>> = new Map();\n\n  /**\n   * Creates an instance of `EventEmitter`.\n   * @constructor\n   * @param {?Partial<{ [K in keyof Events]: Events[K][] }>} [events] \n   */\n  constructor(events?: Partial<{ [K in keyof Events]: Events[K][] }>) {\n    for (const [event, listeners] of Object.entries(events ?? {})) {\n      this.#events.set(event as keyof Events, new Listeners<Events[keyof Events]>());\n      for (const listener of listeners!) {\n        this.#events.get(event as keyof Events)!.add(listener);\n      }\n    }\n  }\n\n  /**\n   * @description Removes all listeners for a specific event type.\n   * @public\n   * @template {keyof Events} Event \n   * @param {Event} event \n   * @returns {this} \n   */\n  public clear<Event extends keyof Events>(event: Event): this {\n    return this.#events.get(event)?.clear(), this;\n  }\n\n  /**\n   * @description Removes all listeners for all event types.\n   * @public\n   * @returns {this} \n   */\n  public clearAll(): this {\n    return this.#events.clear(), this;\n  }\n\n  /**\n   * @description Gets the number of listeners for a specific event.\n   * @public\n   * @template {keyof Events} Event \n   * @param {Event} event \n   * @returns {number} \n   */\n  public count<Event extends keyof Events>(event: Event): number {\n    return this.#events.get(event)?.count() ?? 0;\n  }\n\n  /**\n   * @description Emits an event, calling all listeners for that event type.\n   * @public\n   * @template {keyof Events} Event \n   * @param {Event} event \n   * @param {...Parameters<Events[Event]>} args \n   */\n  public emit<Event extends keyof Events>(event: Event, ...args: Parameters<Events[Event]>): this {\n    return this.#events.get(event)?.emit(...args), this;\n  }\n\n  /**\n   * @description Emits an event asynchronously, calling all listeners for that event type.\n   * @public\n   * @async\n   * @template {keyof Events} Event \n   * @param {Event} event \n   * @param {...Parameters<Events[Event]>} args \n   * @returns {this} \n   */\n  public async emitAsync<Event extends keyof Events>(event: Event, ...args: Parameters<Events[Event]>): Promise<this> {\n    return await this.#events.get(event)?.emitAsync(...args), this;\n  }\n\n  /**\n   * @description Adds a listener for a specific event type.\n   * @public\n   * @template {keyof Events} Event \n   * @param {Event} event \n   * @param {Events[Event]} listener \n   * @returns {this} \n   */\n  public on<Event extends keyof Events>(event: Event, listener: Events[Event]): this {\n    if (!this.#events.has(event)) {\n      this.#events.set(event, new Listeners<Events[Event]>());\n    }\n    return this.#events.get(event)!.add(listener), this;\n  }\n\n  /**\n   * @description Adds a listener for a specific event type.\n   * @public\n   * @template {keyof Events} Event \n   * @param {Event} event \n   * @param {Events[Event]} listener \n   * @returns {this} \n   */\n  public once<Event extends keyof Events>(event: Event, listener: Events[Event]): this {\n    if (!this.#events.has(event)) {\n      this.#events.set(event, new Listeners<Events[Event]>());\n    }\n    return this.#events.get(event)!.add(listener, {once: true}), this;\n  }\n\n  /**\n   * @description Removes a listener for a specific event type.\n   * @public\n   * @template {keyof Events} Event \n   * @param {Event} event \n   * @param {Events[Event]} listener \n   * @returns {this} \n   */\n  public off<Event extends keyof Events>(event: Event, listener: Events[Event]): this {\n    return this.#events.get(event)?.delete(listener), this;\n  }\n}\n","/*\n * Public API Surface of events\n */\n\nexport {\n  EventEmitter,\n  Listeners\n} from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}