Add ienumerate function

This commit is contained in:
Michaël Lemaire 2021-09-02 23:13:21 +02:00
parent 03f050bcfb
commit 6d8eef663a
4 changed files with 32 additions and 0 deletions

View file

@ -58,6 +58,8 @@ isum(i1); // 6
icat(iarray(["a", "b", "c"])); // abc
imin(i1); // 1
imax(i1); // 3
iminBy(i1, (x) => -x); // 3
imaxBy(i1, (x) => -x); // 1
// Transform iterables
iloop(i1); // 1 2 3 1 2 3 ...
@ -67,6 +69,7 @@ ifilter(i3, (x) => x % 4 == 0); // 0 -4 -8 -12 ...
imapfilter(i1, (x) => x != 4 ? x * 2 : null); // 2 6
ipartition(i3, (x) => x % 4 == 0); // [0 -4 -8 ..., -1 -2 -3 -5 ...]
iunique(iarray([1, 4, 2, 4, 3, 1, 5])); // 1 4 2 3 5
ienumerate(iarray(["a", "b", "c"])); // [0, "a"] [1, "b"] [2, "c"]
// Combine iterables
ichain(i1, i2); // 1 2 3 4

View file

@ -35,6 +35,7 @@ ifilter(i3, (x) => x % 4 == 0); // 0 -4 -8 -12 ...
imapfilter(i1, (x) => x != 4 ? x * 2 : null); // 2 6
ipartition(i3, (x) => x % 4 == 0); // [0 -4 -8 ..., -1 -2 -3 -5 ...]
iunique(iarray([1, 4, 2, 4, 3, 1, 5])); // 1 4 2 3 5
ienumerate(iarray(["a", "b", "c"])); // [0, "a"] [1, "b"] [2, "c"]
// Combine iterables
ichain(i1, i2); // 1 2 3 4

View file

@ -8,6 +8,7 @@ import {
ichainit,
icombine,
IEMPTY,
ienumerate,
ifilter,
ifilterclass,
ifiltertype,
@ -286,6 +287,15 @@ describe("Iterators", () => {
]);
});
it("enumerate iterators", () => {
let iterator = ienumerate(iarray(["a", "b", "c"]));
checkit(iterator, [
[0, "a"],
[1, "b"],
[2, "c"],
]);
});
it("zips iterators", () => {
checkit(izip(IEMPTY, IEMPTY), []);
checkit(izip(iarray([1, 2, 3]), iarray(["a", "b"])), [[1, "a"], [

18
mod.ts
View file

@ -390,6 +390,24 @@ export function icombine<T1, T2>(
return ichainit(imap(it1, (v1) => imap(it2, (v2): [T1, T2] => [v1, v2])));
}
/**
* Enumerate another iterable, adding the index before the value.
*/
export function ienumerate<T>(it: Iterable<T>): Iterable<[number, T]> {
return {
[Symbol.iterator]: function* () {
const iterator = it[Symbol.iterator]();
let state = iterator.next();
let idx = 0;
while (!state.done) {
yield [idx, state.value];
state = iterator.next();
idx += 1;
}
},
};
}
/**
* Advance through two iterables at the same time, yielding item pairs
*