]> git.proxmox.com Git - mirror_xterm.js.git/blame - src/EventEmitter.ts
Merge pull request #450 from Tyriar/449_keep_span_pool
[mirror_xterm.js.git] / src / EventEmitter.ts
CommitLineData
2f416371
DI
1/**
2 * @license MIT
3 */
4
5interface ListenerType {
6 (): void;
7 listener?: () => void;
8};
9
10export class EventEmitter {
11 private _events: {[type: string]: ListenerType[]};
12
13 constructor() {
996c25a3
DI
14 // Restore the previous events if available, this will happen if the
15 // constructor is called multiple times on the same object (terminal reset).
16 this._events = this._events || {};
2f416371
DI
17 }
18
0d9d3aca 19 public on(type, listener): void {
2f416371
DI
20 this._events[type] = this._events[type] || [];
21 this._events[type].push(listener);
22 }
23
0d9d3aca 24 public off(type, listener): void {
2f416371
DI
25 if (!this._events[type]) {
26 return;
27 }
28
29 let obj = this._events[type];
30 let i = obj.length;
31
32 while (i--) {
33 if (obj[i] === listener || obj[i].listener === listener) {
34 obj.splice(i, 1);
35 return;
36 }
37 }
38 }
39
2f416371
DI
40 public removeAllListeners(type): void {
41 if (this._events[type]) {
42 delete this._events[type];
43 }
44 }
45
46 public once(type, listener): any {
47 function on() {
48 let args = Array.prototype.slice.call(arguments);
965ebde2 49 this.off(type, on);
2f416371
DI
50 return listener.apply(this, args);
51 }
52 (<any>on).listener = listener;
53 return this.on(type, on);
54 }
55
56 public emit(type): void {
57 if (!this._events[type]) {
58 return;
59 }
60
61 let args = Array.prototype.slice.call(arguments, 1);
62 let obj = this._events[type];
63
64 for (let i = 0; i < obj.length; i++) {
65 obj[i].apply(this, args);
66 }
67 }
68
69 public listeners(type): ListenerType[] {
70 return this._events[type] || [];
71 }
72}