/**
 * Un objeto que contiene ganchos de ciclo de vida como claves que apuntan a una matriz
 * de funciones que se ejecutan cuando se activa un ciclo de vida
 *
 * @privado
 * /
ganchos const_ = {};

/ **
 * Obtenga una lista de ganchos para un ciclo de vida específico
 *
 * @param {cadena} tipo
 * el ciclo de vida para obtener ganchos de
 *
 * @param {Función|Función[]} [fn]
 * Opcionalmente, agregue un gancho (o ganchos) al ciclo de vida que está obteniendo.
 *
 * @return {Array}
 * una matriz de ganchos, o una matriz vacía si no hay ninguno.
 * /
ganchos constantes = función (tipo, fn) {
  ganchos_[tipo] = ganchos_[tipo] || [];
  si (fn) {
    ganchos_[tipo] = ganchos_[tipo].concat(fn);
  }
  volver ganchos_[tipo];
};

/ **
 * Agregue un enlace de función a un ciclo de vida específico de videojs.
 *
 * @param {cadena} tipo
 * el ciclo de vida al que enlazar la función.
 *
 * @param {Función|Función[]}
 * La función o matriz de funciones a adjuntar.
 * /
const gancho = función (tipo, fn) {
  ganchos (tipo, fn);
};

/ **
 * Eliminar un gancho de un ciclo de vida específico de videojs.
 *
 * @param {cadena} tipo
 * el ciclo de vida al que se enganchó la función
 *
 * @param {Función} fn
 * La función enganchada para eliminar
 *
 * @return {booleano}
 * La función que fue eliminada o indefinida
 * /
const removeHook = función (tipo, fn) {
  índice const = ganchos (tipo). indexOf (fn);

  si (índice < = -1) {
    falso retorno;
  }

  ganchos_[tipo] = ganchos_[tipo].slice();
  ganchos_[tipo].empalme(índice, 1);

  devolver verdadero;
};

/ **
 * Agregue un enlace de función que solo se ejecutará una vez en un ciclo de vida específico de videojs.
 *
 * @param {cadena} tipo
 * el ciclo de vida al que enlazar la función.
 *
 * @param {Función|Función[]}
 * La función o matriz de funciones a adjuntar.
 * /
const hookOnce = función (tipo, fn) {
  ganchos (tipo, []. concat (fn). mapa (original => {
    contenedor const = (... argumentos) => {
      removeHook(tipo, contenedor);
      devolver original(...argumentos);
    };

    envoltorio de retorno;
  }));
};

exportar {
  manos_,
  manos,
  gancho,
  anzuelo una vez,
  Quitar gancho
};