Skip to content

Commit 9693129

Browse files
authored
Create index.ts
1 parent d809e03 commit 9693129

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

src/events/interface/index.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
export interface Listener<T> {
2+
(event: T): any;
3+
}
4+
5+
export interface Disposable {
6+
dispose();
7+
}
8+
9+
/** passes through events as they happen. You will not get events from before you start listening */
10+
export class TypedEvent<T> {
11+
private listeners: Listener<T>[] = [];
12+
private listenersOncer: Listener<T>[] = [];
13+
14+
on = (listener: Listener<T>): Disposable => {
15+
this.listeners.push(listener);
16+
return {
17+
dispose: () => this.off(listener)
18+
};
19+
}
20+
21+
once = (listener: Listener<T>): void => {
22+
this.listenersOncer.push(listener);
23+
}
24+
25+
off = (listener: Listener<T>) => {
26+
var callbackIndex = this.listeners.indexOf(listener);
27+
if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);
28+
}
29+
30+
emit = (event: T) => {
31+
/** Update any general listeners */
32+
this.listeners.forEach((listener) => listener(event));
33+
34+
/** Clear the `once` queue */
35+
if (this.listenersOncer.length > 0) {
36+
const toCall = this.listenersOncer;
37+
this.listenersOncer = [];
38+
toCall.forEach((listener) => listener(event));
39+
}
40+
}
41+
42+
pipe = (te: TypedEvent<T>): Disposable => {
43+
return this.on((e) => te.emit(e));
44+
}
45+
}

0 commit comments

Comments
 (0)