Home Reference Source

src/range.js

/**
 * 範囲を表現するイテレーターを返します。
 *
 * @param {number[]} args - []か[end]、[start, end]、[start, end step]のどれか。startのデフォルト値は0、stepのデフォルト値は1、endのデフォルト値は無限
 *
 * @return {iterator} 範囲のイテレーター
 *
 * @example
 * range();         // [0, 1, 2, 3, ...]のイテレーター
 * range(5);        // [0, 1, 2, 3, 4]のイテレーター
 * range(1, 5);     // [1, 2, 3, 4]のイテレーター
 * range(1, 5, 2);  // [1, 3]のイテレーター
 */
export default function* range(...args) {
  const [start, end, step] = (() => {
    switch (args.length) {
    case 0:
      return [0, Infinity, 1];

    case 1:
      return [0, args[0], 1];

    case 2:
      return [args[0], args[1], 1];

    default:
      return args;
    }
  })();

  for (let x = start; x < end; x += step) {
    yield x;
  }
};