/**
 * Ein Objekt, das Lebenszyklus-Haken als Schlüssel enthält, die auf ein Array zeigen
 * der Funktionen, die ausgeführt werden, wenn ein Lebenszyklus ausgelöst wird
 *
 * @privat
 * /
const hooks_ = {};

/**
 * Abrufen einer Liste von Haken für einen bestimmten Lebenszyklus
 *
 * @param {string} type
 *         den Lebenszyklus, um Haken zu erhalten von
 *
 * @param {Funktion|Funktion[]} [fn]
 *         Fügen Sie dem Lebenszyklus, den Sie erhalten, optional einen Haken (oder mehrere Haken) hinzu.
 *
 * @return {Array}
 *         ein Array von Haken oder ein leeres Array, wenn es keine gibt.
 * /
const hooks = function(type, fn) {
  hooks_[type] = hooks_[type] || [];
  if (fn) {
    hooks_[type] = hooks_[type].concat(fn);
  }
  return hooks_[type];
};

/**
 * Hinzufügen eines Funktionshakens zu einem bestimmten Videojs-Lebenszyklus.
 *
 * @param {string} type
 *        den Lebenszyklus, an den die Funktion angehängt werden soll.
 *
 * @param {Funktion|Funktion[]}
 *        Die Funktion oder das Array von Funktionen, die angehängt werden sollen.
 * /
const hook = function(type, fn) {
  hooks(type, fn);
};

/**
 * Entfernen eines Hooks aus einem bestimmten videojs-Lebenszyklus.
 *
 * @param {string} type
 *         den Lebenszyklus, an den die Funktion angehängt ist
 *
 * @param {Funktion} fn
 *         Die gehakte Funktion zum Entfernen
 *
 * @return {boolean}
 *         Die Funktion, die entfernt wurde, oder undef
 * /
const removeHook = function(type, fn) {
  const index = hooks(type).indexOf(fn);

  wenn (index <= -1) {
    return false;
  }

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

  true zurückgeben;
};

/**
 * Fügen Sie einen Funktionshaken hinzu, der nur einmal in einem bestimmten videojs-Lebenszyklus ausgeführt wird.
 *
 * @param {string} type
 *        den Lebenszyklus, an den die Funktion angehängt werden soll.
 *
 * @param {Funktion|Funktion[]}
 *        Die Funktion oder das Array von Funktionen, die angehängt werden sollen.
 * /
const hookOnce = function(type, fn) {
  hooks(type, [].concat(fn).map(original => {
    const wrapper = (...args) => {
      removeHook(type, wrapper);
      return original(...args);
    };

    return wrapper;
  }));
};

exportieren {
  hooks_,
  haken,
  haken,
  hookOnce,
  removeHook
};