]>
Commit | Line | Data |
---|---|---|
1 | /** | |
2 | * @license MIT | |
3 | */ | |
4 | ||
5 | interface ListenerType { | |
6 | (): void; | |
7 | listener?: () => void; | |
8 | }; | |
9 | ||
10 | export class EventEmitter { | |
11 | private _events: {[type: string]: ListenerType[]}; | |
12 | ||
13 | constructor() { | |
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 || {}; | |
17 | } | |
18 | ||
19 | public on(type, listener): void { | |
20 | this._events[type] = this._events[type] || []; | |
21 | this._events[type].push(listener); | |
22 | } | |
23 | ||
24 | public off(type, listener): void { | |
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 | ||
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); | |
49 | this.off(type, on); | |
50 | return listener.apply(this, args); | |
51 | } | |
52 | (<any>on).listener = listener; | |
53 | return this.on(type, on); | |
54 | } | |
55 | ||
56 | public emit(type: string, ...args: any[]): void { | |
57 | if (!this._events[type]) { | |
58 | return; | |
59 | } | |
60 | let obj = this._events[type]; | |
61 | for (let i = 0; i < obj.length; i++) { | |
62 | obj[i].apply(this, args); | |
63 | } | |
64 | } | |
65 | ||
66 | public listeners(type): ListenerType[] { | |
67 | return this._events[type] || []; | |
68 | } | |
69 | } |