Skip to content

parzh/xrange

Repository files navigation

Test changes npm version npm size licence MIT

github npm

xrange

Python-esque iterator for number ranges

xrange is a function based on Python 3's range class (or Python 2's xrange class). Like the one in Python, xrange creates virtual arrays (see Iterators) which allows getting values lazily. This prevents over-the-top memory consumption when using large numbers, and opens the possibility to create never-ending, infinite lists.

Created with create-package-typescript

Simple iteration:

for (const number of xrange(5))
  console.log(number); // 0, 1, 2, 3, 4

Creation of arrays:

[ ...xrange(5) ];
// [ 0, 1, 2, 3, 4 ]

Infinite and backward iteration:

xrange(0, Infinity);
// 0, 1, 2, 3, … (never ends)
xrange(10, 0, -1);
// 10, 9, 8, 7, 6, 5, 4, 3, 2, 1

Complex number sequences:

xrange(1, (next) => next < 100, ([ last, prelast = 0 ]) => last + prelast);
// 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
xrange(0, () => true, ([ last ]) => last ? 0 : 1);
// 0, 1, 0, 1, 0, 1, … (never ends)

Iteration with methods (see #14):

xrange(17, 42, 5).forEach(number => {
  console.log(number); // 17, 22, 27, 32, 37
});

See more in /docs/examples

range vs xrange

Looking for less functionality in a smaller bundle? Check out @xrange/core and @xrange/func

The main difference of xrange from range is that xrange is an iterator, not an array constructor, — it yields numbers on demand, leaving array creation decision to user, which can always be done using the ... spread operator or Array.from.

While also having a larger bundle, xrange delegates the actual iteration to @xrange/core, which is vastly smaller, and can be used on its own (in some cases the usage is different though).

While @xrange/core provides numeric iterator, @xrange/func implements predicated iteration, provided as a separate smaller package. It also has less error correction, but the functionality is quite similar to xrange, since xrange uses @xrange/func under the hood.