export type EventName = string | symbol;
export type EventHandlers = Record<EventName, unknown>;
export type EventHandler<T extends EventHandlers, K extends keyof T = keyof T> = (event: T[K]) => void;
export type AllEventsHandler<T extends EventHandlers, K extends keyof T = keyof T> = (type: K, event: T[K]) => void;
/**
 * Lightweight event emitter
 */
export declare class Emitter<T extends EventHandlers = {}> {
    private handlers;
    /**
     * Add a listener for an event
     */
    on(name: "*", handler: AllEventsHandler<T>): void;
    on<K extends keyof T>(name: K, handler: EventHandler<T, K>): void;
    /**
     * Remove a listener from an event
     */
    off<K extends keyof T>(name: K, handler: EventHandler<T, K>): void;
    /**
     * Subscribe to an event and return an unsubscribe function.
     */
    subscribe<K extends keyof T>(name: K, handler: EventHandler<T, K>): () => void;
    /**
     * Emit an event.
     */
    emit<K extends keyof T>(name: K, event: T[K]): void;
}
