/**
 * 包含生命週期鉤子作為指向數組的鍵的對象
 * 觸發生命週期時運行的函數
 *
 * @私人的
 */
const hooks_ = {};

/**
 * 獲取特定生命週期的鉤子列表
 *
 * @param {string} 類型
 * 從中獲取鉤子的生命週期
 *
 * @param {函數|函數[]} [fn]
 * 可選地向您正在獲得的生命週期添加一個(或多個)鉤子。
 *
 * @return {數組}
 * 鉤子數組,如果沒有則為空數組。
 */
const hooks = 函數(類型,fn){
  hooks_[類型] = hooks_[類型] || [];
  如果(fn){
    hooks_[type] = hooks_[type].concat(fn);
  }
  返回鉤子_[類型];
};

/**
 * 將函數掛鉤添加到特定的 videojs 生命週期。
 *
 * @param {string} 類型
 * 掛鉤函數的生命週期。
 *
 * @param {函數|函數[]}
 * 要附加的函數或函數數組。
 */
const hook = 函數(類型,fn){
  鉤子(類型,fn);
};

/**
 * 從特定的 videojs 生命週期中刪除一個鉤子。
 *
 * @param {string} 類型
 * 函數掛鉤的生命週期
 *
 * @param {函數} fn
 * 要刪除的鉤子函數
 *
 * @return {布爾值}
 * 被移除或取消定義的函數
 */
const removeHook = 函數(類型,fn){
  const index = hooks(type).indexOf(fn);

  如果(索引 <= -1){
    返回假;
  }

  hooks_[type] = hooks_[type].slice();
  hooks_[type].splice(index, 1);

  返回真;
};

/**
 * 添加一個只運行一次的函數掛鉤到特定的 videojs 生命週期。
 *
 * @param {string} 類型
 * 掛鉤函數的生命週期。
 *
 * @param {函數|函數[]}
 * 要附加的函數或函數數組。
 */
const hookOnce = 函數(類型,fn){
  鉤子(類型,[].concat(fn).map(原始=> {
    常量包裝器 = (...args) => {
      removeHook(類型,包裝器);
      返回原件(...參數);
    };

    返回包裝器;
  }));
};

出口 {
  鉤子_,
  掛鉤,
  鉤,
  鉤一次,
  移除鉤子
};