-
-
Notifications
You must be signed in to change notification settings - Fork 831
/
EventDispatcher.ts
57 lines (44 loc) · 1.47 KB
/
EventDispatcher.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import type { CustomEventArgs } from "../Types/CustomEventArgs";
import type { CustomEventListener } from "../Types/CustomEventListener";
export class EventDispatcher {
private _listeners: Map<string, CustomEventListener[]>;
constructor() {
this._listeners = new Map<string, CustomEventListener[]>();
}
addEventListener(type: string, listener: CustomEventListener): void {
this.removeEventListener(type, listener);
if (!this._listeners.get(type)) {
this._listeners.set(type, []);
}
this._listeners.get(type)?.push(listener);
}
dispatchEvent(type: string, args: CustomEventArgs): void {
this._listeners.get(type)?.forEach((handler) => handler(args));
}
hasEventListener(type: string): boolean {
return !!this._listeners.get(type);
}
removeAllEventListeners(type?: string): void {
if (!type) {
this._listeners = new Map<string, CustomEventListener[]>();
} else {
this._listeners.delete(type);
}
}
removeEventListener(type: string, listener: CustomEventListener): void {
const arr = this._listeners.get(type);
if (!arr) {
return;
}
const length = arr.length,
idx = arr.indexOf(listener);
if (idx < 0) {
return;
}
if (length === 1) {
this._listeners.delete(type);
} else {
arr.splice(idx, 1);
}
}
}