import type { Disposable } from "../types/Common";

/**
 * Basic event emitter interface for reactive file systems
 */
export interface IEventEmitter {
  on(event: string | symbol, handler: (...args: any[]) => void): Disposable;
  once(event: string | symbol, handler: (...args: any[]) => void): Disposable;
  emit(event: string | symbol, ...args: any[]): boolean;
  off(event: string | symbol, handler?: (...args: any[]) => void): void;
  removeAllListeners(event?: string | symbol): void;
}

/**
 * Type-safe event emitter interface
 */
export interface ITypedEventEmitter<T extends Record<string, any>> {
  on<K extends keyof T>(event: K, handler: (payload: T[K]) => void): Disposable;
  once<K extends keyof T>(
    event: K,
    handler: (payload: T[K]) => void,
  ): Disposable;
  emit<K extends keyof T>(event: K, payload: T[K]): boolean;
  off<K extends keyof T>(event: K, handler?: (payload: T[K]) => void): void;
  removeAllListeners<K extends keyof T>(event?: K): void;
}
