import {EventEmitter} from "stream";

/**
 * This class is used for TypeSafe events.
 * @internal
 */
export class TypedEventEmitter<TEvents extends Record<string, any>> {
    private emitter = new EventEmitter()

    /**
     * @internal
     */
    emit<TEventName extends keyof TEvents & string>(
        eventName: TEventName,
        ...eventArg: TEvents[TEventName]
    ) {
        this.emitter.emit(eventName, ...(eventArg as []))
    }

    /**
     * @internal
     */
    on<TEventName extends keyof TEvents & string>(
        eventName: TEventName,
        handler: (...eventArg: TEvents[TEventName]) => void
    ) {
        this.emitter.on(eventName, handler as any)
    }

    /**
     * @internal
     */
    off<TEventName extends keyof TEvents & string>(
        eventName: TEventName,
        handler: (...eventArg: TEvents[TEventName]) => void
    ) {
        this.emitter.off(eventName, handler as any)
    }
}
