5 import { IEventEmitter } from './Interfaces';
7 interface ListenerType {
12 export class EventEmitter implements IEventEmitter {
13 private _events: {[type: string]: ListenerType[]};
16 // Restore the previous events if available, this will happen if the
17 // constructor is called multiple times on the same object (terminal reset).
18 this._events = this._events || {};
21 public on(type, listener): void {
22 this._events[type] = this._events[type] || [];
23 this._events[type].push(listener);
26 public off(type, listener): void {
27 if (!this._events[type]) {
31 let obj = this._events[type];
35 if (obj[i] === listener || obj[i].listener === listener) {
42 public removeAllListeners(type): void {
43 if (this._events[type]) {
44 delete this._events[type];
48 public once(type, listener): any {
50 let args = Array.prototype.slice.call(arguments);
52 return listener.apply(this, args);
54 (<any>on).listener = listener;
55 return this.on(type, on);
58 public emit(type: string, ...args: any[]): void {
59 if (!this._events[type]) {
62 let obj = this._events[type];
63 for (let i = 0; i < obj.length; i++) {
64 obj[i].apply(this, args);
68 public listeners(type): ListenerType[] {
69 return this._events[type] || [];