export class DefaultEventEmitter {
  // 参考: https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget
  listeners: any = {};

  emit(type: string, ...args: any[]) {
    if (!(type in this.listeners)) {
      return;
    }
    const stack = this.listeners[type];
    for (let i = 0, l = stack.length; i < l; i++) {
      stack[i].call(this, event);
      const func = stack[i];

      if (typeof func === 'function') {
        func(...args);
      }
    }
  }

  addListener(type: string, callback: (...args: any[]) => any) {
    if (!(type in this.listeners)) {
      this.listeners[type] = [];
    }

    this.listeners[type].push(callback);
  }

  removeListener(type: string, callback: (...args: any[]) => any): any {
    if (!(type in this.listeners)) {
      return;
    }
    const stack = this.listeners[type];
    for (let i = 0, l = stack.length; i < l; i++) {
      if (stack[i] === callback) {
        stack.splice(i, 1);
        return this.removeListener(type, callback);
      }
    }
  }
}