Numeric Range Generator With Step Validation

Build inclusive numeric ranges with positive or negative steps, validate inputs and stream large ranges lazily through a generator.

JavascriptData Integrity

Code

snippet
function assertNumber(name, value) {
  if (!Number.isFinite(value)) throw new TypeError(name + " must be a finite number");
}

export function range(start, end, step = 1) {
  assertNumber("start", start);
  assertNumber("end", end);
  assertNumber("step", step);
  if (step === 0) throw new RangeError("step must not be zero");
  const result = [];
  if (step > 0) {
    for (let value = start; value <= end; value += step) result.push(value);
  } else {
    for (let value = start; value >= end; value += step) result.push(value);
  }
  return result;
}

export function* rangeIter(start, end, step = 1) {
  assertNumber("start", start);
  assertNumber("end", end);
  assertNumber("step", step);
  if (step === 0) throw new RangeError("step must not be zero");
  if (step > 0) {
    for (let value = start; value <= end; value += step) yield value;
  } else {
    for (let value = start; value >= end; value += step) yield value;
  }
}