type EventHandler<T = any> = (data: T) => void | Promise<void>;
interface IEventEmitter<EventTypes = Record<string, any>> {
    on<Event extends keyof EventTypes>(event: Event, handler: EventHandler<EventTypes[Event]>): number;
    once<Event extends keyof EventTypes>(event: Event, handler: EventHandler<EventTypes[Event]>): number;
    off(id: number): void;
    emit<Event extends keyof EventTypes>(event: Event, value: EventTypes[Event]): void;
}
declare class EventEmitter<EventTypes = Record<string, any>> implements IEventEmitter<EventTypes> {
    protected index: number;
    protected subscriptions: Map<keyof EventTypes, {
        readonly id: number;
        readonly handler: EventHandler;
    }[]>;
    on<Event extends keyof EventTypes>(event: Event, handler: EventHandler<EventTypes[Event]>): number;
    once<Event extends keyof EventTypes>(event: Event, handler: EventHandler<EventTypes[Event]>): number;
    off(id: number): void;
    emit<Event extends keyof EventTypes>(event: Event, value: EventTypes[Event]): void;
}

export { EventEmitter, type EventHandler, type IEventEmitter };
