blob: 9ef2aa8d78ab7163c08312338c85dde1f95abe77 (
plain)
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
|
export interface Listener<T> {
(event: T): any;
}
export interface Disposable {
dispose(): void;
}
/** passes through events as they happen. You will not get events from before you start listening */
export class TypedEvent<T> {
private listeners: Listener<T>[] = [];
private listenersOncer: Listener<T>[] = [];
on = (listener: Listener<T>): Disposable => {
this.listeners.push(listener);
return {
dispose: () => this.off(listener),
};
};
once = (listener: Listener<T>): void => {
this.listenersOncer.push(listener);
};
off = (listener: Listener<T>) => {
const callbackIndex = this.listeners.indexOf(listener);
if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);
};
emit = (event: T) => {
/** Update any general listeners */
this.listeners.forEach(listener => listener(event));
/** Clear the `once` queue */
this.listenersOncer.forEach(listener => listener(event));
this.listenersOncer = [];
};
pipe = (te: TypedEvent<T>): Disposable => this.on(e => te.emit(e));
}
|