/**
 * @file time-ranges.js
 * @module 時間範圍
 */
從“全局/窗口”導入窗口;

/**
 * 返回指定索引開始或結束的時間
 * TimeRange 對象。
 *
 * @typedef {函數} TimeRangeIndex
 *
 * @param {number} [索引=0]
 * 返回時間的範圍號。
 *
 * @return {數字}
 * 指定索引處的時間偏移量。
 *
 * @deprecated 必須提供索引參數。
 * 以後遺漏它會拋出錯誤。
 */

/**
 * 包含時間範圍的對象。
 *
 * @typedef {Object} 時間範圍
 *
 * @property {number} 長度
 * 此對象表示的時間範圍數。
 *
 * @property {模塊:時間範圍〜時間索引} 開始
 * 返回指定時間範圍開始的時間偏移量。
 *
 * @property {模塊:時間範圍〜時間索引} 結束
 * 返回指定時間範圍結束的時間偏移量。
 *
 * @see https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges
 */

/**
 * 檢查是否有任何時間範圍超過最大索引。
 *
 * @私人的
 * @param {string} fnName
 * 用於記錄的函數名
 *
 * @param {number} 索引
 * 要檢查的索引
 *
 * @param {number} 最大索引
 * 最大可能索引
 *
 * @throws {Error} 如果提供的時間範圍超過 maxIndex
 */
函數 rangeCheck(fnName, index, maxIndex) {
  如果(類型索引!== '數字' || 索引 <  0 || 索引 > 最大索引){
    拋出新的錯誤(`無法在'TimeRanges'上執行'$ {fnName}':提供的索引 (${index}) 是非數字的或超出範圍 (0-${maxIndex}).`);
  }
}

/**
 * 獲取指定索引開始或結束的時間
 * TimeRange 對象。
 *
 * @私人的
 * @param {string} fnName
 * 用於記錄的函數名
 *
 * @param {string} 值索引
 * 用於獲取時間的屬性。應該
 *“開始”或“結束”
 *
 * @param {Array} 範圍
 * 時間範圍數組
 *
 * @param {數組} [rangeIndex=0]
 * 開始搜索的索引
 *
 * @return {數字}
 * 在指定索引處偏移的時間。
 *
 * @deprecated rangeIndex 必須設置一個值,將來這會拋出錯誤。
 * @throws {Error} 如果 rangeIndex 大於範圍的長度
 */
函數 getRange(fnName, valueIndex, ranges, rangeIndex) {
  rangeCheck(fnName, rangeIndex, ranges.length - 1);
  返回範圍[範圍索引][值索引];
}

/**
 * 創建一個給定時間範圍的時間範圍對象。
 *
 * @私人的
 * @param {數組} [範圍]
 * 一組時間範圍。
 */
函數 createTimeRangesObj(範圍){
  讓時間範圍對象;

  如果(範圍===未定義||範圍。長度=== 0){
    時間範圍對象 = {
      長度:0,
      開始() {
        throw new Error('這個 TimeRanges 對像是空的');
      },
      結尾() {
        throw new Error('這個 TimeRanges 對像是空的');
      }
    };
  }其他{
    時間範圍對象 = {
      長度:範圍。長度,
      開始:getRange.bind(空,'開始',0,範圍),
      結束:getRange.bind(空,'結束',1,範圍)
    };
  }

  如果 (window.Symbol && window.Symbol.iterator) {
    timeRangesObj[window.Symbol.iterator] = () => (範圍 || []).values();
  }

  返回時間範圍對象;
}

/**
 * 創建一個模仿 TimeRange 的對象
 * {@link https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges|HTML5 TimeRanges 實例}。
 *
 * @param {number|Array[]} 開始
 * 單個範圍(數字)或範圍數組(一個
 * 數組數組,每個數組包含兩個數字)。
 *
 * @param {number} 結束
 * 單個範圍的結尾。不能與數組形式一起使用
 * `start` 參數。
 */
導出函數 createTimeRanges(開始,結束){
  如果(Array.isArray(開始)){
    返回 createTimeRangesObj(開始);
  } else if(開始===未定義||結束===未定義){
    返回 createTimeRangesObj();
  }
  返回 createTimeRangesObj([[開始,結束]]);
}

導出 { createTimeRanges 作為 createTimeRange };