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;
}