Sanjay's challenge

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;
  }
    
  end == undefined && ([end, start] = [start, 0]);
  !skip && (skip = (start < end) ? +1 : -1);

  yield* [...
    [... Array(Math.abs(end - start) / Math.abs(skip)).keys()]
      .map(value => start + value * skip)
  ];
}

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