Sanjay's challenge (improved)
by Arnaud Buchholz
HTML
<script src="https://arnaudbuchholz.github.io/blog/jsfiddle-assert.js"></script>
JavaScript
function* range (start, end, skip) {
if ((start === undefined) ||Â (start && end === undefined && skip) || (start < end && skip <= 0) || (start > end && skip >= 0)) {
return null;
}
if (end === undefined) {
[end, start] = [start, 0]
}
const sign = Math.sign(end - start)
if (!skip) {
skip = sign
}
for (let index = start; sign * index < sign * end; index += skip) {
yield index
}
}
check = (range, expected) => {
return range.length === expected.length
&& expected.every((value, index) => range[index] === value)
}
assert(() => check([... range(5)], [0, 1, 2, 3, 4]))
assert(() => check([... range(0, 3)], [0, 1, 2]))
assert(() => check([... range(0, 4, 2)], [0, 2]))
assert(() => check([... range(3, 0)], [3, 2, 1]))
assert(() => check([... range(4, 0, -2)], [4, 2]))