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.
Code
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;
}
}Report a problem with this exampleOpens a pre-filled issue on GitHub.