-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheventBus.ts
More file actions
36 lines (29 loc) · 1.01 KB
/
Copy patheventBus.ts
File metadata and controls
36 lines (29 loc) · 1.01 KB
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
type BusEvents = Record<string, (...args: any[]) => void>;
export class EventBus<T extends { [K in keyof T]: (...args: any[]) => void } = BusEvents> {
private events: { [K in keyof T]?: Array<T[K]> } = {};
on<K extends keyof T>(event: K, listener: T[K]): Function {
(this.events[event] ||= []).push(listener);
return () => this.off(event, listener);
}
emit<K extends keyof T>(event: K, ...args: Parameters<T[K]>) {
(this.events[event] || []).forEach((fn) => fn(...args));
}
off<K extends keyof T>(event: K, listener?: T[K]) {
if (!listener) {
delete this.events[event];
return;
}
this.events[event] = (this.events[event] || []).filter((l) => l !== listener);
}
once<K extends keyof T>(event: K, listener: T[K]): void {
const onceListener = (...args: Parameters<T[K]>) => {
listener(...args);
this.off(event, onceListener as T[K]);
};
this.on(event, onceListener as T[K]);
}
removeAllListener() {
this.events = {};
}
}
export default EventBus;