// index.d.ts
export type EventKey = string | number | symbol;
export type EventCallback = (...args: any[]) => void;

export interface EventedType {
  on(eventName: EventKey, callback: EventCallback, ctx?: any): this;
  off(eventName?: EventKey, callback?: EventCallback): this;
  fire(eventName: EventKey, ...args: any[]): this;
}

export default function eventify<T extends {}>(subject: T & {
  on?: never;
  off?: never;
  fire?: never;
}): EventedType & T;
