1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| export type EventType = string | symbol
export type Handler<T = unknown> = (event: T) => void
export type WildcardHandler<T = Record<string, unknown>> = ( type: keyof T, event: T[keyof T] ) => void
export type EventHandlerList<T = unknown> = Array<Handler<T>> export type WildCardEventHandlerList<T = Record<string, unknown>> = Array< WildcardHandler<T> >
export type EventHandlerMap<Events extends Record<EventType, unknown>> = Map< keyof Events | '*', EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events> >
export interface Emitter<Events extends Record<EventType, unknown>> { all: EventHandlerMap<Events>
on<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>): void on(type: '*', handler: WildcardHandler<Events>): void
off<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>): void off(type: '*', handler: WildcardHandler<Events>): void
emit<Key extends keyof Events>(type: Key, event: Events[Key]): void emit<Key extends keyof Events>( type: undefined extends Events[Key] ? Key : never ): void }
export default function mitt<Events extends Record<EventType, unknown>>( all?: EventHandlerMap<Events> ): Emitter<Events> { type GenericEventHandler = | Handler<Events[keyof Events]> | WildcardHandler<Events> all = all || new Map()
return {
all,
on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) { const handlers: Array<GenericEventHandler> | undefined = all!.get(type) if (handlers) { handlers.push(handler) } else { all!.set(type, [handler] as EventHandlerList<Events[keyof Events]>) } },
off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) { const handlers: Array<GenericEventHandler> | undefined = all!.get(type) if (handlers) { if (handler) { handlers.splice(handlers.indexOf(handler) >>> 0, 1) } else { all!.set(type, []) } } },
emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) { let handlers = all!.get(type) if (handlers) { ;(handlers as EventHandlerList<Events[keyof Events]>) .slice() .map((handler) => { handler(evt!) }) }
handlers = all!.get('*') if (handlers) { ;(handlers as WildCardEventHandlerList<Events>) .slice() .map((handler) => { handler(type, evt!) }) } }, } }
|