/**
 * @file 시간 범위.js
 * @module 시간 범위
 */
'글로벌/창'에서 창 가져오기;

/**
 * 시작 또는 끝에서 지정된 인덱스의 시간을 반환합니다.
 * TimeRange 개체의.
 *
 * @typedef {기능} TimeRangeIndex
 *
 * @param {숫자} [인덱스=0]
 * 시간을 반환할 범위 번호입니다.
 *
 * @return {숫자}
 * 지정된 인덱스에서의 시간 오프셋.
 *
 * @deprecated 인덱스 인수를 제공해야 합니다.
 * 앞으로는 그대로 두면 오류가 발생합니다.
 */

/**
 * 시간 범위를 포함하는 개체입니다.
 *
 * @typedef {객체} 시간 범위
 *
 * @property {숫자} 길이
 * 이 개체가 나타내는 시간 범위의 수입니다.
 *
 * @property {module:time-ranges~TimeRangeIndex} 시작
 * 지정된 시간 범위가 시작되는 시간 오프셋을 반환합니다.
 *
 * @property {module:time-ranges~TimeRangeIndex} end
 * 지정된 시간 범위가 끝나는 시간 오프셋을 반환합니다.
 *
 * @see https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges
 */

/**
 * 시간 범위가 최대 인덱스를 초과하는지 확인하십시오.
 *
 * @사적인
 * @param {문자열} fn이름
 * 로깅에 사용할 함수 이름
 *
 * @param {숫자} 색인
 * 확인할 인덱스
 *
 * @param {숫자} maxIndex
 * 가능한 최대 인덱스
 *
 * @throws {Error} 제공된 timeRanges가 maxIndex를 초과하는 경우
 */
함수 rangeCheck(fnName, 인덱스, maxIndex) {
  if (인덱스 유형 !== '숫자' || 인덱스 < 0 || 색인 > 최대 인덱스) {
    throw new Error(`'TimeRanges'에서 '${fnName}' 실행 실패: 제공된 인덱스(${index})가 숫자가 아니거나 범위를 벗어났습니다(0-${maxIndex}).`);
  }
}

/**
 * 시작 또는 끝에서 지정된 인덱스에 대한 시간 가져오기
 * TimeRange 개체의.
 *
 * @사적인
 * @param {문자열} fn이름
 * 로깅에 사용할 함수 이름
 *
 * @param {문자열} 값 인덱스
 * 시간을 얻기 위해 사용해야 하는 속성입니다. 해야한다
 * '시작' 또는 '종료'
 *
 * @param {배열} 범위
 * 시간 범위의 배열
 *
 * @param {배열} [rangeIndex=0]
 * 검색을 시작할 인덱스
 *
 * @return {숫자}
 * 지정된 인덱스에서 오프셋되는 시간.
 *
 * @deprecated rangeIndex는 값으로 설정해야 합니다. 나중에 오류가 발생합니다.
 * @throws {Error} rangeIndex가 범위 길이보다 큰 경우
 */
함수 getRange(fnName, valueIndex, 범위, rangeIndex) {
  rangeCheck(fnName, rangeIndex, ranges.length - 1);
  반환 범위[rangeIndex][valueIndex];
}

/**
 * 시간 범위가 주어진 시간 범위 개체를 만듭니다.
 *
 * @사적인
 * @param {배열} [범위]
 * 시간 범위의 배열.
 */
함수 createTimeRangesObj(범위) {
  let timeRangesObj;

  if (범위 === 정의되지 않음 || 범위.길이 === 0) {
    timeRangesObj = {
      길이: 0,
      시작() {
        throw new Error('이 TimeRanges 객체는 비어 있습니다.');
      },
      끝() {
        throw new Error('이 TimeRanges 객체는 비어 있습니다.');
      }
    };
  } else {
    timeRangesObj = {
      길이: 범위.길이,
      시작: getRange.bind(널, '시작', 0, 범위),
      끝: getRange.bind(널, '종료', 1, 범위)
    };
  }

  if (창.기호 && window.Symbol.iterator) {
    timeRangesObj[window.Symbol.iterator] = () => (범위 || []).values();
  }

  반환 timeRangesObj;
}

/**
 * 'TimeRange' 객체를 생성합니다.
 * {@링크 https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges|HTML5 TimeRanges 인스턴스}.
 *
 * @param {번호|배열[]} 시작
 * 단일 범위(숫자) 또는 범위 배열(
 * 각각 두 개의 숫자 배열의 배열).
 *
 * @param {숫자} 끝
 * 단일 범위의 끝. 의 배열 형식과 함께 사용할 수 없습니다.
 * `시작` 인수.
 */
내보내기 기능 createTimeRanges(시작, 종료) {
  if (Array.isArray(시작)) {
    return createTimeRangesObj(시작);
  } 그렇지 않으면 (시작 === 정의되지 않음 || 끝 === 정의되지 않음) {
    return createTimeRangesObj();
  }
  return createTimeRangesObj([[시작, 종료]]);
}

내보내기 { createTimeRange를 createTimeRange로 };