-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevents.ts
41 lines (32 loc) · 1.02 KB
/
events.ts
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
export class Events<TEvents extends Record<string, (...args: any[]) => void>> {
#handlers = new Map<any, Set<(...args: any) => void>>();
constructor() {
this.on = this.on.bind(this);
this.emit = this.emit.bind(this);
}
on<TEvent extends keyof TEvents>(
...[event, handler]: TEvent extends keyof TEvents
? [event: TEvent, handler: (...args: Parameters<TEvents[TEvent]>) => void]
: never
): () => void {
handler = handler.bind(null);
let handlers = this.#handlers.get(event);
if (!handlers) {
this.#handlers.set(event, (handlers = new Set()));
}
handlers.add(handler);
return () => {
handlers?.delete(handler);
};
}
emit<TEvent extends keyof TEvents>(
...[event, ...args]: TEvent extends keyof TEvents ? [event: TEvent, ...args: Parameters<TEvents[TEvent]>] : never
): boolean {
const handlers = this.#handlers.get(event);
if (!handlers?.size) {
return false;
}
handlers.forEach((handler) => handler(...args));
return true;
}
}