-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathObservable.ts
41 lines (34 loc) · 1.08 KB
/
Observable.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 function AddObservable<
Events extends string,
T extends {
new (...args: any[]): {
_notify(e: Events): void;
_get(e: Events): any;
};
},
>(constructor: T) {
return class extends constructor {
private readonly _listeners: Record<Events, Array<() => void>>;
constructor(...args: any[]) {
super(...args);
this._listeners = {} as Record<Events, Array<() => void>>;
}
public _notify = (event: Events) => {
if (this._listeners[event]) {
this._listeners[event].forEach((f) => f());
}
};
private _on = (event: Events, fn: () => void) => {
if (!this._listeners[event]) {
this._listeners[event] = [];
}
this._listeners[event].push(fn);
return () => {
const index = this._listeners[event].indexOf(fn);
if (index > -1) {
this._listeners[event].splice(index, 1);
}
};
};
};
}