/**
 * All events are emitted using this key.
 */
export declare const ALL_EVENTS: unique symbol;
/**
 * Valid `ALL_EVENTS` listener args.
 */
export declare type AllEventsArg<T> = {
    [K in keyof T]: {
        type: K;
        args: T[K];
    };
}[keyof T];
/**
 * Internally defined emitter events.
 */
export interface EmitterEvents<T> {
    [ALL_EVENTS]: [AllEventsArg<T>];
}
/**
 * All possible events, user provided and built-in.
 */
export declare type Events<T> = T & EmitterEvents<T>;
/**
 * List of valid event args given `K`.
 */
export declare type ValidEventArgs<T, K extends keyof Events<T>> = K extends keyof EmitterEvents<T> ? EmitterEvents<T>[K] : K extends keyof T ? ValidArgs<T[K]> : never;
/**
 * Valid event listener args from `T`.
 */
export declare type ValidArgs<T> = T extends unknown[] ? T : never;
/**
 * Event listener type.
 */
export declare type EventListener<T, K extends keyof Events<T>> = (...args: ValidEventArgs<T, K>) => void;
/**
 * Wrap `fn` for uniqueness, avoids removing different `fn` in stack.
 */
export declare type $Wrap<T> = {
    fn: T;
};
/**
 * Type-safe event emitter.
 */
export declare class Emitter<T> {
    $: {
        [K in keyof Events<T>]: Set<$Wrap<EventListener<T, K>>>;
    };
    on<K extends keyof Events<T>>(type: K, fn: EventListener<T, K>): () => boolean;
    emit<K extends keyof T>(type: K, ...args: ValidEventArgs<T, K>): void;
}
/**
 * Helper to listen to an event once only.
 */
export declare function once<T, K extends keyof Events<T>>(events: Emitter<T>, type: K, callback: EventListener<T, K>): () => boolean;
