range.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /**
  2. * Simulate the python range() builtin function.
  3. * inspired by https://dev.to/guyariely/using-python-range-in-javascript-337p
  4. *
  5. * If needed outside of an iterator context, use `Array.from(range(10))` or
  6. * spread syntax `[...range(10)]` to get an array.
  7. *
  8. * @param {number} start: the start or end of the range.
  9. * @param {number} stop: the end of the range.
  10. * @param {number} step: the step of the range.
  11. * @returns {object} an object with a Symbol.iterator method over the range
  12. */
  13. export default function range(start, stop, step) {
  14. return {
  15. [Symbol.iterator]() {
  16. if (stop === undefined) {
  17. stop = start;
  18. start = 0;
  19. }
  20. if (step === undefined) {
  21. step = 1;
  22. }
  23. let i = start - step;
  24. return {
  25. next() {
  26. i += step;
  27. if ((step > 0 && i < stop) || (step < 0 && i > stop)) {
  28. return {
  29. value: i,
  30. done: false,
  31. };
  32. }
  33. return {
  34. value: undefined,
  35. done: true,
  36. };
  37. },
  38. };
  39. },
  40. };
  41. }