import { Disposable, EventIn, EventKey, EventOut, Listener, ListenerMap } from './types'; export * from './types'; export declare const $listeners: unique symbol; export declare const $addListener: unique symbol; /** Statically typed event emitter */ export declare class EventEmitter { [$listeners]: { [K in EventKey]?: IListenerList; }; constructor(); /** Unique symbol for accessing the internal listener cache */ static readonly ev: symbol; /** Count the number of listeners for an event */ static count(ee: EventEmitter, key: EventKey): number; /** Check if an event has listeners */ static has(ee: EventEmitter, key: '*' | EventKey): boolean; /** Get an array of event keys that have listeners */ static keys(ee: EventEmitter): Array>; /** Call the given listener when no other listeners exist */ static unhandle>(ee: EventEmitter, key: K, impl: Listener, disposables?: Disposable[]): typeof impl; /** Add a recurring listener */ on>(key: K, fn: Listener, disposables?: Disposable[]): typeof fn; /** Add many recurring listeners */ on(map: ListenerMap, disposables?: Disposable[]): this; /** Add a one-time listener */ one>(key: K, fn: Listener): typeof fn; /** Add many one-time listeners */ one(map: ListenerMap): this; /** Remove one or all listeners of an event */ off>(key: K, fn?: Listener): this; /** Remove all listeners from all events */ off(key: '*'): this; /** Call the listeners of an event */ emit>(key: K, ...args: EventIn): EventOut; /** Iterate over the listeners of an event */ listeners>(key: K): IterableIterator>; /** Called when an event goes from 0 -> 1 listeners */ protected _onEventHandled?(key: string): void; /** Called when an event goes from 1 -> 0 listeners */ protected _onEventUnhandled?(key: string): void; /** Implementation of the `on` and `one` methods */ protected [$addListener](arg: EventKey | ListenerMap, fn?: Listener, disposables?: Disposable[], once?: boolean): this | Listener; } interface IListener = EventKey> { fn: Listener; once: boolean; next: IListener | null; } interface IListenerList = EventKey> { first: IListener; last: IListener; }