//#region src/event/emitter.d.ts /** * Event emitter utils * * @example * ```ts * import { createEmitter } from '@kazupon/jts-utils/event/emitter' * ``` * * @module event/emitter */ /** * @license MIT * @author kazuya kawaguchi (a.k.a. kazupon) */ /** * Event type */ type EventType = string | symbol; /** * Event handler * * @typeParam T - Event payload type */ type EventHandler = T extends undefined ? () => void : T extends unknown[] ? (...args: T) => void : (payload: T) => void; /** * Event stop handler */ interface EventStopHandler extends Disposable { (): void; } /** * Wildcard event handler * * @typeParam T - Event map type */ type WildcardEventHandler> = (event: keyof T, payload?: T[keyof T]) => void; /** * Event handler list * * @typeParam T - Event payload type */ type EventHandlerList = Array>; /** * Wildcard event handler list * * @typeParam T - Event map type */ type WildcardEventHandlerList> = Array>; /** * Event handler map * * @typeParam Events - Event map type */ type EventHandlerMap> = Map | WildcardEventHandlerList>; /** * Event emitter interface * * @typeParam Events - Event map type */ interface Emittable = {}> { /** * A map of event names of registered event handlers */ /** * Register a wildcard event handler that receives all events * * @param event - The wildcard event type "*" * @param handler - A {@link WildcardEventHandler} * @returns An {@link EventStopHandler} */ on(event: "*", handler: WildcardEventHandler): EventStopHandler; /** * Register an event handler with the event type * * @typeParam Key - An event type key * * @param event - An {@link EventType} * @param handler - An {@link EventHandler} * @returns An {@link EventStopHandler} */ on(event: Key, handler: EventHandler): EventStopHandler; /** * Unregister a wildcard event handler * * @param event - The wildcard event type "*" * @param handler - A {@link WildcardEventHandler} */ off(event: "*", handler: WildcardEventHandler): void; /** * Unregister an event handler for the event type * * @typeParam Key - An event type key * * @param event - An {@link EventType} * @param handler - An {@link EventHandler} */ off(event: Key, handler: EventHandler): void; /** * Invoke all handlers with the event type. * * Note Manually firing "*" handlers should be not supported * * @typeParam Key - An event type key * * @param event - An {@link EventType} * @param payload - An event payload, optional if the event type is `undefined` */ emit(event: Key, ...payload: Events[Key] extends undefined ? [] : Events[Key] extends unknown[] ? Events[Key] : [payload: Events[Key]]): void; /** * Register a one-time wildcard event handler that receives all events. * The handler will be automatically unregistered after the first invocation. * * @param event - The wildcard event type "*" * @param handler - A {@link WildcardEventHandler} * @returns A function to manually stop the handler before it fires */ once(event: "*", handler: WildcardEventHandler): () => void; /** * Register a one-time event handler with the event type. * The handler will be automatically unregistered after the first invocation. * * @typeParam Key - An event type key * * @param event - An {@link EventType} * @param handler - An {@link EventHandler} * @returns A function to manually stop the handler before it fires */ once(event: Key, handler: EventHandler): () => void; /** * Dispose the event emitter and all registered event handlers */ dispose(): void; } /** * An options for {@link createEmitter} */ interface EmitterOptions { /** * Disable wildcard event handlers * * @default true */ disableWildcard?: boolean; } /** * Create a event emitter * * This event emitter forked and inspired from the below: * - original repository url: https://github.com/developit/mitt * - code url: https://github.com/developit/mitt/blob/master/src/index.ts * - author: Jason Miller (https://github.com/developit) * * @typeParam Events - Event map type * * @param options - An optional {@link EmitterOptions} * @returns An event emitter, which is {@link Emittable} */ declare function Emitter>(options?: EmitterOptions): Emittable & Disposable; //#endregion export { Emittable, Emitter, EmitterOptions, EventHandler, EventHandlerList, EventHandlerMap, EventStopHandler, EventType, WildcardEventHandler, WildcardEventHandlerList };