import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
import _createClass from '@babel/runtime/helpers/createClass';

/**
 * 事件总线类
 * 实现发布-订阅模式，用于组件间通信
 * @example
 * ```ts
 * const bus = new EventBus();
 *
 * // 订阅事件
 * bus.on('message', (data) => {
 *   console.log('收到消息:', data);
 * });
 *
 * // 发布事件
 * bus.emit('message', 'Hello World');
 *
 * // 取消订阅
 * bus.off('message');
 * ```
 */
var EventBus = /*#__PURE__*/function () {
  function EventBus() {
    _classCallCheck(this, EventBus);
    this.events = {};
  }
  /**
   * 发布事件
   * 触发指定事件的所有监听器
   * @param eventName - 事件名称
   * @param args - 传递给监听器的参数
   */
  return _createClass(EventBus, [{
    key: "emit",
    value: function emit(eventName) {
      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        args[_key - 1] = arguments[_key];
      }
      if (this.events[eventName]) {
        this.events[eventName].forEach(function (fn) {
          fn.apply(void 0, args);
        });
      }
    }
    /**
     * 订阅事件
     * 添加事件监听器
     * @param eventName - 事件名称
     * @param fn - 监听器函数
     */
  }, {
    key: "on",
    value: function on(eventName, fn) {
      this.events[eventName] = this.events[eventName] || [];
      this.events[eventName].push(fn);
    }
    /**
     * 取消订阅
     * 移除指定事件的监听器
     * @param eventName - 事件名称
     * @param fn - 要移除的监听器函数，如果不传则移除该事件的所有监听器
     */
  }, {
    key: "off",
    value: function off(eventName, fn) {
      if (!fn) {
        delete this.events[eventName];
        return;
      }
      if (this.events[eventName]) {
        for (var i = 0; i < this.events[eventName].length; i++) {
          if (this.events[eventName][i] === fn) {
            this.events[eventName].splice(i, 1);
            break;
          }
        }
      }
    }
  }]);
}();

export { EventBus };
