/**
 * 배열을 가리키는 키로 라이프사이클 후크를 포함하는 객체
 * 수명 주기가 트리거될 때 실행되는 함수
 *
 * @사적인
 */
const hooks_ = {};

/**
 * 특정 라이프사이클에 대한 후크 목록 가져오기
 *
 * @param {문자열} 유형
 * 후크를 가져올 수명 주기
 *
 * @param {함수|함수[]} [fn]
 * 선택적으로 얻고 있는 수명 주기에 후크(또는 후크)를 추가합니다.
 *
 * @return {배열}
 * 후크의 배열 또는 없는 경우 빈 배열.
 */
const 후크 = function(type, fn) {
  hooks_[유형] = hooks_[유형] || [];
  경우 (fn) {
    hooks_[유형] = hooks_[유형].concat(fn);
  }
  return hooks_[유형];
};

/**
 * 특정 videojs 수명 주기에 함수 후크를 추가합니다.
 *
 * @param {문자열} 유형
 * 함수를 연결할 수명 주기.
 *
 * @param {함수|함수[]}
 * 연결할 함수 또는 함수 배열입니다.
 */
const 후크 = 함수(유형, fn) {
  후크(유형, fn);
};

/**
 * 특정 videojs 수명 주기에서 후크를 제거합니다.
 *
 * @param {문자열} 유형
 * 함수가 연결된 수명 주기
 *
 * @param {함수} fn
 * 제거할 hooked 함수
 *
 * @return {부울}
 * 제거되거나 정의되지 않은 함수
 */
const removeHook = 함수(유형, fn) {
  const index = hooks(type).indexOf(fn);

  만약 (인덱스 < = -1) {
    거짓을 반환합니다.
  }

  hooks_[유형] = hooks_[유형].slice();
  hooks_[유형].splice(인덱스, 1);

  true를 반환합니다.
};

/**
 * 특정 videojs 수명 주기에 한 번만 실행되는 함수 후크를 추가합니다.
 *
 * @param {문자열} 유형
 * 함수를 연결할 수명 주기.
 *
 * @param {함수|함수[]}
 * 연결할 함수 또는 함수 배열입니다.
 */
const hookOnce = 함수(유형, fn) {
  hooks(유형, [].concat(fn).map(원본 => {
    const 래퍼 = (...인수) => {
      removeHook(유형, 래퍼);
      return original(...args);
    };

    반환 래퍼;
  }));
};

내보내다 {
  후크_,
  후크,
  훅,
  hookOnce,
  removeHook
};