Typescript iterator/iterable range based on Rust's std::ops::Range
.
The range start..end contains all values with start <= x < end. It is empty if start >= end.
const list = [];
const iter = range(0, 5);
let result = iter.next();
while (!result.done) {
list.push(result.value);
result = iter.next();
}
console.log(result.value); // 5;
console.log(list); // [0, 1, 2, 3, 4]
const list = [];
for (const x of range(0, 5)) {
list.push(x);
}
console.log(list); // [0, 1, 2, 3, 4]
const list = [];
for (const x of range(0, 5, true)) {
list.push(x);
}
console.log(list); // [0, 1, 2, 3, 4, 5]
There is a proposal, that brings multiple helper functions to Iterator
You can use it today by utilizing core-js-pure:
import { from as iterFrom } from "core-js-pure/features/iterator";
// or if it's working for you (it should work according to the docs,
// but hasn't for me for some reason):
// import iterFrom from "core-js-pure/features/iterator/from";
let m = new Map();
m.set("13", 37);
m.set("42", 42);
const arr = iterFrom(m.values())
.map((val) => val * 2)
.toArray();
// prints "[74, 84]"
console.log(arr);
The good part is that is being rapidly adopted by the main vendors, Chrome intends to ship them on version 117 and there's strong support for Firefox and Safari, which means soon this will be widespread.
Reverses an iterator’s direction.
const list = [];
for (const x of range(0, 5).rev()) {
list.push(x);
}
console.log(list); // [4, 3, 2, 1, 0]
Creates an iterator starting at the same point, but stepping by the given amount at each iteration.
const list = [];
for (const x of range(0, 5).step(2)) {
list.push(x);
}
console.log(list); // [0, 2, 4]
Creates an iterator which clones all of its elements.
const original = range(0, 5);
const clone = original.clone();
const list = [];
for (const x of original) {
list.push(x);
}
for (const x of clone) {
list.push(x);
}
console.log(list); // [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
Returns the exact remaining length of the iterator.
const iter = range(1, 10, true);
console.log(iter.len()); // 10
for (const x of iter) {
if (x === 5) {
console.log(iter.len()); // 5
}
}
Returns true
if item is contained in the range.
console.log(range(0, 5).contains(10)); // false
console.log(range(0, 5).contains(-5)); // false
console.log(range(0, 10).contains(0)); // true
console.log(range(0, 10).contains(5)); // true
console.log(range(0, 10, true).contains(10)); // true
Returns true
if the range contains no items.
console.log(range(0, 0, true).empty()); // false
console.log(range(0, 1).empty()); // false
console.log(range(10, 5).empty()); // true