import { Event, EventListener } from './event'; import { LeakageMonitor } from './leakage'; import { EventProfiling } from './profiling'; export type EmitterListenerAware = (emitter?: Emitter) => void; export interface EmitterOptions { onFirstListenerAdd?: EmitterListenerAware; onFirstListenerDidAdd?: EmitterListenerAware; onListenerDidAdd?: EmitterListenerAware; onLastListenerRemove?: EmitterListenerAware; } export type ScopedListener = EventListener | [EventListener, any]; /** * An emitter can be used to emit event. * * @example * ```ts * class Example { * private readonly _onMessage = new Emitter<[message: string, sender: string]>(); * public readonly onMessage = this._onMessage.event; * * public something() { * this._onMessage.emit(["Hello World!", "something"]); * } * } * * const example = new Example(); * * example.onMessage(([message, sender]) => { * console.log(`Message from ${sender}: ${message}`); * }); * * example.something(); * ``` */ export declare class Emitter { protected readonly _options?: EmitterOptions; protected readonly _leakageMon?: LeakageMonitor; protected readonly _perfMon?: EventProfiling; protected _disposed: boolean; protected _listeners: Set>; protected _deliveryQueue?: [ScopedListener, T][]; constructor(options?: EmitterOptions); get listenerCount(): number; /** * The event that is controller by this emitter. */ readonly event: Event; /** * Emit this event. * @returns `true` if any listeners have been called. */ emit(data: T): any; dispose(): void; hasListeners(): boolean; }