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]))