/**
 * @file time-ranges.js
 * rangos de tiempo @module
 * /
importar ventana desde 'global/window';

/ **
 * Devuelve el tiempo para el índice especificado al principio o al final
 * de un objeto TimeRange.
 *
 * @typedef {Función} TimeRangeIndex
 *
 * @param {número} [índice=0]
 * El número de rango para devolver el tiempo.
 *
 * @return {número}
 * El desplazamiento de tiempo en el índice especificado.
 *
 * @deprecated Se debe proporcionar el argumento de índice.
 * En el futuro, dejarlo fuera arrojará un error.
 * /

/ **
 * Un objeto que contiene rangos de tiempo.
 *
 * @typedef {Objeto} Intervalo de tiempo
 *
 * @property {número} longitud
 * El número de intervalos de tiempo representados por este objeto.
 *
 * @property {módulo: intervalos de tiempo ~ TimeRangeIndex} inicio
 * Devuelve el desplazamiento de tiempo en el que comienza un intervalo de tiempo especificado.
 *
 * @property {módulo:intervalos de tiempo~TimeRangeIndex} end
 * Devuelve el desplazamiento de tiempo en el que finaliza un intervalo de tiempo especificado.
 *
 * @ver https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges
 * /

/ **
 * Comprobar si alguno de los rangos de tiempo está por encima del índice máximo.
 *
 * @privado
 * @param {cadena} fnName
 * El nombre de la función que se usará para iniciar sesión
 *
 * @param {número} índice
 * El índice para comprobar
 *
 * @param {número} maxIndex
 * El índice máximo posible
 *
 * @arroja {Error} si los intervalos de tiempo proporcionados están por encima del índice máximo
 * /
función rangeCheck(fnName, index, maxIndex) {
  if (tipo de índice !== 'número' || índice < 0 || índice > índicemáx) {
    throw new Error(`Error al ejecutar '${fnName}' en 'TimeRanges': El índice proporcionado (${index}) no es numérico o está fuera de los límites (0-${maxIndex}).`);
  }
}

/ **
 * Obtenga el tiempo para el índice especificado al principio o al final
 * de un objeto TimeRange.
 *
 * @privado
 * @param {cadena} fnName
 * El nombre de la función que se usará para iniciar sesión
 *
 * @param {cadena} índice de valor
 * La propiedad que debe usarse para obtener el tiempo. debiera ser
 * 'comienzo' o 'fin'
 *
 * @param {Array} rangos
 * Una matriz de rangos de tiempo
 *
 * @param {Array} [índice de rango=0]
 * El índice para iniciar la búsqueda en
 *
 * @return {número}
 * El tiempo que compensa en el índice especificado.
 *
 * @deprecated rangeIndex debe establecerse en un valor; en el futuro, esto arrojará un error.
 * @arroja {Error} si rangeIndex es mayor que la longitud de los rangos
 * /
función getRange(fnName, valueIndex, ranges, rangeIndex) {
  rangeCheck(fnName, rangeIndex, ranges.length - 1);
  rangos de retorno [índice de rango] [índice de valor];
}

/ **
 * Crear un objeto de rango de tiempo dado rangos de tiempo.
 *
 * @privado
 * @param {Array} [rangos]
 * Una matriz de rangos de tiempo.
 * /
function crearTimeRangesObj(rangos) {
  dejar timeRangesObj;

  if (rango === indefinido || rangos.longitud === 0) {
    timeRangesObj = {
      longitud: 0,
      comenzar() {
        throw new Error('Este objeto TimeRanges está vacío');
      },
      fin() {
        throw new Error('Este objeto TimeRanges está vacío');
      }
    };
  } else {
    timeRangesObj = {
      longitud: rangos.longitud,
      inicio: getRange.bind(nulo, 'inicio', 0, rangos),
      fin: getRange.bind(nulo, 'fin', 1, rangos)
    };
  }

  si (ventana. Símbolo && ventana.Símbolo.iterador) {
    timeRangesObj[ventana.Símbolo.iterador] = () => (rango || []).valores();
  }

  retorno timeRangesObj;
}

/ **
 * Cree un objeto `TimeRange` que imite un
 * {@enlace https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges|Instancia de HTML5 TimeRanges}.
 *
 * @param {número|Array[]} comienzo
 * El comienzo de un solo rango (un número) o una matriz de rangos (un
 * arreglo de arreglos de dos números cada uno).
 *
 * @param {número} fin
 * El final de un solo rango. No se puede utilizar con la forma de matriz de
 * el argumento `inicio`.
 * /
función de exportación createTimeRanges (inicio, fin) {
  if (Array.isArray(inicio)) {
    devuelve createTimeRangesObj(inicio);
  } else if (inicio === indefinido || final === indefinido) {
    devuelve createTimeRangesObj();
  }
  return createTimeRangesObj([[inicio, fin]]);
}

exportar { createTimeRanges as createTimeRange };