import mitt, { Emitter, Handler, EventType } from 'mitt'
type EventMap = {
[key: EventType]: unknown
}
type TypedHandler<T extends EventMap, K extends keyof T> = Handler<T[K]>
export class EventEmitter<T extends EventMap> {
private emitter: Emitter<T>
constructor() {
this.emitter = mitt<T>()
}
on<K extends keyof T>(type: K, handler: TypedHandler<T, K>) {
this.emitter.on(type, handler)
}
off<K extends keyof T>(type: K, handler: TypedHandler<T, K>) {
this.emitter.off(type, handler)
}
emit<K extends keyof T>(type: K, event: T[K]) {
this.emitter.emit(type, event)
}
}