import { Action, Fn } from './types.js';
import { DispatchResultItem } from './dispatch-result.js';
/**
 * @internal
 */
export declare class ListenerRegistry<P extends unknown[], R> {
    #private;
    readonly [Symbol.toStringTag] = "ListenerRegistry";
    /**
     * The number of listeners currently registered.
     */
    get size(): number;
    /**
     * Checks whether the listener is currently registered.
     */
    has(listener: Fn<P, R>): boolean;
    /**
     * Convenience inverse of `has`.
     */
    lacks(listener: Fn<P, R>): boolean;
    /**
     * Removes a listener if present.
     *
     * @returns `true` if removed, `false` if it was not registered.
     */
    off(listener: Fn<P, R>): boolean;
    /**
     * Registers a listener if not already present.
     *
     * @param onRemove Optional callback invoked when this listener is removed.
     * @returns `true` if added, `false` if it was already registered.
     */
    on(listener: Fn<P, R>, onRemove?: Action): boolean;
    /**
     * Registers a listener that will automatically unregister after its next dispatch.
     *
     * @param onRemove Optional callback invoked when this listener is removed.
     * @returns `true` if added, `false` if it was already registered.
     */
    once(listener: Fn<P, R>, onRemove?: Action): boolean;
    /**
     * Removes all listeners and clears the dispatch snapshot.
     */
    clear(): void;
    /**
     * Dispatches to all listeners in snapshot order.
     * One-time listeners are removed before invocation.
     * Exceptions are captured as ResultError so dispatch continues (unwrap to surface rejections).
     *
     * @param values Arguments forwarded to each listener.
     * @returns Array of listener results or promises, one per listener.
     */
    dispatch(...values: P): DispatchResultItem<R | void>[];
}
