Iterator / AsyncIterator utility pack for JavaScript and TypeScript. Each module is designed to work independently, avoiding internal inter-dependencies as much as possible.
To apply single operation to an iterable, use modules under the root.
import { map } from "@core/iterutil/map";
const iter = map([1, 2, 3], (v) => v * 2);
console.log(Array.from(iter)); // [2, 4, 6]
To apply single asynchronous operation to an (async) iterable, use modules under
the async
submodule.
import { map } from "@core/iterutil/async/map";
const iter = map([1, 2, 3], (v) => Promise.resolve(v * 2));
console.log(await Array.fromAsync(iter)); // [2, 4, 6]
To apply multiple operations to an iterable, use the modules under the pipe
submodule with the @core/pipe package.
import { pipe } from "@core/pipe";
import { cycle } from "@core/iterutil/pipe/cycle";
import { filter } from "@core/iterutil/pipe/filter";
import { map } from "@core/iterutil/pipe/map";
import { take } from "@core/iterutil/pipe/take";
const iter = pipe(
[1, 2, 3],
map((v) => v * 2),
cycle,
take(10),
filter((v) => v % 2 === 0),
);
console.log(Array.from(iter)); // [2, 4, 6, 2, 4, 6, 2, 4, 6, 2]
To apply multiple asynchronous operations to an (async) iterable, use the
modules under the pipe/async
submodule with the @core/pipe package.
import { pipe } from "@core/pipe";
import { cycle } from "@core/iterutil/pipe/async/cycle";
import { filter } from "@core/iterutil/pipe/async/filter";
import { map } from "@core/iterutil/pipe/async/map";
import { take } from "@core/iterutil/pipe/async/take";
const iter = pipe(
[1, 2, 3],
map((v) => Promise.resolve(v * 2)),
cycle,
take(10),
filter((v) => Promise.resolve(v % 2 === 0)),
);
console.log(await Array.fromAsync(iter)); // [2, 4, 6, 2, 4, 6, 2, 4, 6, 2]
Chains multiple iterables together.
import { chain } from "@core/iterutil/chain";
const iter = chain([1, 2], ["a", "b"], [true, false]);
console.log(Array.from(iter)); // [1, 2, "a", "b", true, false]
import { chain } from "@core/iterutil/async/chain";
const iter = chain([1, 2], ["a", "b"], [true, false]);
console.log(await Array.fromAsync(iter)); // [1, 2, "a", "b", true, false]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { chain } from "@core/iterutil/pipe/chain";
const iter = pipe(
[1, 2],
chain(["a", "b"], [true, false]),
);
console.log(Array.from(iter)); // [1, 2, "a", "b", true, false]
import { pipe } from "@core/pipe";
import { chain } from "@core/iterutil/pipe/async/chain";
const iter = pipe(
[1, 2],
chain(["a", "b"], [true, false]),
);
console.log(await Array.fromAsync(iter)); // [1, 2, "a", "b", true, false]
Chunks an iterable into arrays of a given size.
import { chunked } from "@core/iterutil/chunked";
const iter = chunked([1, 2, 3, 4, 5], 2);
console.log(Array.from(iter)); // [[1, 2], [3, 4], [5]]
import { chunked } from "@core/iterutil/async/chunked";
const iter = chunked([1, 2, 3, 4, 5], 2);
console.log(await Array.fromAsync(iter)); // [[1, 2], [3, 4], [5]]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { chunked } from "@core/iterutil/pipe/chunked";
const iter = pipe(
[1, 2, 3, 4, 5],
chunked(2),
);
console.log(Array.from(iter)); // [[1, 2], [3, 4], [5]]
import { pipe } from "@core/pipe";
import { chunked } from "@core/iterutil/pipe/async/chunked";
const iter = pipe(
[1, 2, 3, 4, 5],
chunked(2),
);
console.log(await Array.fromAsync(iter)); // [[1, 2], [3, 4], [5]]
Removes all nullish (null
or undefined
) values from an iterable.
import { compact } from "@core/iterutil/compact";
const iter = compact([1, undefined, 2, null, 3]);
console.log(Array.from(iter)); // [1, 2, 3]
import { compact } from "@core/iterutil/async/compact";
const iter = compact([1, undefined, 2, null, 3]);
console.log(await Array.fromAsync(iter)); // [1, 2, 3]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { compact } from "@core/iterutil/pipe/compact";
const iter = pipe(
[1, undefined, 2, null, 3],
compact,
);
console.log(Array.from(iter)); // [1, 2, 3]
import { pipe } from "@core/pipe";
import { compact } from "@core/iterutil/pipe/async/compact";
const iter = pipe(
[1, undefined, 2, null, 3],
compact,
);
console.log(await Array.fromAsync(iter)); // [1, 2, 3]
Compresses an iterable by selecting elements using a selector iterable.
import { compress } from "@core/iterutil/compress";
const iter = compress(
[1, 2, 3, 4, 5],
[true, false, true, false, true],
);
console.log(Array.from(iter)); // [1, 3, 5]
import { compress } from "@core/iterutil/async/compress";
const iter = compress(
[1, 2, 3, 4, 5],
[true, false, true, false, true],
);
console.log(await Array.fromAsync(iter)); // [1, 3, 5]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { compress } from "@core/iterutil/pipe/compress";
const iter = pipe(
[1, 2, 3, 4, 5],
compress([true, false, true, false, true]),
);
console.log(Array.from(iter)); // [1, 3, 5]
import { pipe } from "@core/pipe";
import { compress } from "@core/iterutil/pipe/async/compress";
const iter = pipe(
[1, 2, 3, 4, 5],
compress([true, false, true, false, true]),
);
console.log(await Array.fromAsync(iter)); // [1, 3, 5]
Generates an infinite sequence of numbers starting from start
with a step of
step
.
import { count } from "@core/iterutil/count";
import { take } from "@core/iterutil/take";
const iter = count(1, 2);
console.log(Array.from(take(iter, 5))); // [1, 3, 5, 7, 9]
Returns an infinite iterable that cycles through the given iterable.
import { cycle } from "@core/iterutil/cycle";
import { take } from "@core/iterutil/take";
const iter = cycle([1, 2, 3]);
console.log(Array.from(take(iter, 5))); // [1, 2, 3, 1, 2]
import { cycle } from "@core/iterutil/async/cycle";
import { take } from "@core/iterutil/async/take";
const iter = cycle([1, 2, 3]);
console.log(await Array.fromAsync(take(iter, 5))); // [1, 2, 3, 1, 2]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { cycle } from "@core/iterutil/pipe/cycle";
import { take } from "@core/iterutil/pipe/take";
const iter = pipe(
[1, 2, 3],
cycle,
take(5),
);
console.log(Array.from(iter)); // [1, 2, 3, 1, 2]
import { pipe } from "@core/pipe";
import { cycle } from "@core/iterutil/pipe/async/cycle";
import { take } from "@core/iterutil/pipe/async/take";
const iter = pipe(
[1, 2, 3],
cycle,
take(5),
);
console.log(await Array.fromAsync(iter)); // [1, 2, 3, 1, 2]
Drops the first limit
items from the iterable.
import { drop } from "@core/iterutil/drop";
const iter = drop([1, 2, 3, 4, 5], 2);
console.log(Array.from(iter)); // [3, 4, 5]
import { drop } from "@core/iterutil/async/drop";
const iter = drop([1, 2, 3, 4, 5], 2);
console.log(await Array.fromAsync(iter)); // [3, 4, 5]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { drop } from "@core/iterutil/pipe/drop";
const iter = pipe(
[1, 2, 3, 4, 5],
drop(2),
);
console.log(Array.from(iter)); // [3, 4, 5]
import { pipe } from "@core/pipe";
import { drop } from "@core/iterutil/pipe/async/drop";
const iter = pipe(
[1, 2, 3, 4, 5],
drop(2),
);
console.log(await Array.fromAsync(iter)); // [3, 4, 5]
Drops elements from the iterable while the predicate returns true.
import { dropWhile } from "@core/iterutil/drop-while";
const iter = dropWhile(
[1, 2, 3, 4, 5],
(v) => v < 3,
);
console.log(Array.from(iter)); // [3, 4, 5]
import { dropWhile } from "@core/iterutil/async/drop-while";
const iter = dropWhile(
[1, 2, 3, 4, 5],
(v) => v < 3,
);
console.log(await Array.fromAsync(iter)); // [3, 4, 5]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { dropWhile } from "@core/iterutil/pipe/drop-while";
const iter = pipe(
[1, 2, 3, 4, 5],
dropWhile((v) => v < 3),
);
console.log(Array.from(iter)); // [3, 4, 5]
import { pipe } from "@core/pipe";
import { dropWhile } from "@core/iterutil/pipe/async/drop-while";
const iter = pipe(
[1, 2, 3, 4, 5],
dropWhile((v) => v < 3),
);
console.log(await Array.fromAsync(iter)); // [3, 4, 5]
Enumerates an iterable.
import { enumerate } from "@core/iterutil/enumerate";
const iter = enumerate(["a", "b", "c"]);
console.log(Array.from(iter)); // [[0, "a"], [1, "b"], [2, "c"]]
import { enumerate } from "@core/iterutil/async/enumerate";
const iter = enumerate(["a", "b", "c"]);
console.log(await Array.fromAsync(iter)); // [[0, "a"], [1, "b"], [2, "c"]]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { enumerate } from "@core/iterutil/pipe/enumerate";
const iter = pipe(["a", "b", "c"], enumerate);
console.log(Array.from(iter)); // [[0, "a"], [1, "b"], [2, "c"]]
import { pipe } from "@core/pipe";
import { enumerate } from "@core/iterutil/pipe/async/enumerate";
const iter = pipe(["a", "b", "c"], enumerate);
console.log(await Array.fromAsync(iter)); // [[0, "a"], [1, "b"], [2, "c"]]
Returns true if every element in the iterable satisfies the provided testing function.
import { every } from "@core/iterutil/every";
console.log(every([1, 2, 3], (v) => v > 0)); // true
console.log(every([1, 2, 3], (v) => v > 1)); // false
import { every } from "@core/iterutil/async/every";
console.log(await every([1, 2, 3], (v) => v > 0)); // true
console.log(await every([1, 2, 3], (v) => v > 1)); // false
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { every } from "@core/iterutil/pipe/every";
console.log(pipe([1, 2, 3], every((v) => v > 0))); // true
console.log(pipe([1, 2, 3], every((v) => v > 1))); // false
import { pipe } from "@core/pipe";
import { every } from "@core/iterutil/pipe/async/every";
console.log(await pipe([1, 2, 3], every((v) => v > 0))); // true
console.log(await pipe([1, 2, 3], every((v) => v > 1))); // false
Filters an iterable based on a function.
import { filter } from "@core/iterutil/filter";
const iter = filter(
[1, 2, 3, 4, 5],
(v) => v % 2 === 0,
);
console.log(Array.from(iter)); // [2, 4]
import { filter } from "@core/iterutil/async/filter";
const iter = filter(
[1, 2, 3, 4, 5],
(v) => v % 2 === 0,
);
console.log(await Array.fromAsync(iter)); // [2, 4]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { filter } from "@core/iterutil/pipe/filter";
const iter = pipe(
[1, 2, 3, 4, 5],
filter((v) => v % 2 === 0),
);
console.log(Array.from(iter)); // [2, 4]
import { pipe } from "@core/pipe";
import { filter } from "@core/iterutil/pipe/async/filter";
const iter = pipe(
[1, 2, 3, 4, 5],
filter((v) => v % 2 === 0),
);
console.log(await Array.fromAsync(iter)); // [2, 4]
Returns the first element in the iterable that satisfies the provided testing function. Otherwise, undefined is returned.
import { find } from "@core/iterutil/find";
const value = find(
[1, 2, 3, 4, 5],
(v) => v % 2 === 0,
);
console.log(value); // 2
import { find } from "@core/iterutil/async/find";
const value = await find(
[1, 2, 3, 4, 5],
(v) => v % 2 === 0,
);
console.log(value); // 2
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { find } from "@core/iterutil/pipe/find";
const value = pipe(
[1, 2, 3, 4, 5],
find((v) => v % 2 === 0),
);
console.log(value); // 2
import { pipe } from "@core/pipe";
import { find } from "@core/iterutil/pipe/async/find";
const value = await pipe(
[1, 2, 3, 4, 5],
find((v) => v % 2 === 0),
);
console.log(value); // 2
Returns the first element of an iterable. If the iterable is empty, returns
undefined
.
import { first } from "@core/iterutil/first";
const result = first([1, 2, 3]);
console.log(result); // 1
import { first } from "@core/iterutil/async/first";
const result = await first([1, 2, 3]);
console.log(result); // 1
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { first } from "@core/iterutil/pipe/first";
const result = pipe([1, 2, 3], first);
console.log(result); // 1
import { pipe } from "@core/pipe";
import { first } from "@core/iterutil/pipe/async/first";
const result = await pipe([1, 2, 3], first);
console.log(result); // 1
Maps each value in an iterable to an iterable, then flattens the result.
import { flatMap } from "@core/iterutil/flat-map";
const iter = flatMap(
[1, 2, 3],
(v) => [v, v],
);
console.log(Array.from(iter)); // [1, 1, 2, 2, 3, 3]
import { flatMap } from "@core/iterutil/async/flat-map";
const iter = flatMap(
[1, 2, 3],
(v) => [v, v],
);
console.log(await Array.fromAsync(iter)); // [1, 1, 2, 2, 3, 3]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { flatMap } from "@core/iterutil/pipe/flat-map";
const iter = pipe(
[1, 2, 3],
flatMap((v) => [v, v]),
);
console.log(Array.from(iter)); // [1, 1, 2, 2, 3, 3]
import { pipe } from "@core/pipe";
import { flatMap } from "@core/iterutil/pipe/async/flat-map";
const iter = pipe(
[1, 2, 3],
flatMap((v) => [v, v]),
);
console.log(await Array.fromAsync(iter)); // [1, 1, 2, 2, 3, 3]
Flattens an iterable of iterables into a single iterable.
import { flatten } from "@core/iterutil/flatten";
const iter = flatten([[1, 2], [3, 4], [5]]);
console.log(Array.from(iter)); // [1, 2, 3, 4, 5]
import { flatten } from "@core/iterutil/async/flatten";
const iter = flatten([[1, 2], [3, 4], [5]]);
console.log(await Array.fromAsync(iter)); // [1, 2, 3, 4, 5]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { flatten } from "@core/iterutil/pipe/flatten";
const iter = pipe(
[[1, 2], [3, 4], [5]],
flatten,
);
console.log(Array.from(iter)); // [1, 2, 3, 4, 5]
import { pipe } from "@core/pipe";
import { flatten } from "@core/iterutil/pipe/async/flatten";
const iter = pipe(
[[1, 2], [3, 4], [5]],
flatten,
);
console.log(await Array.fromAsync(iter)); // [1, 2, 3, 4, 5]
Calls a function for each value in an iterable.
import { forEach } from "@core/iterutil/for-each";
forEach([1, 2, 3], (v) => console.log(v));
// 1
// 2
// 3
import { forEach } from "@core/iterutil/async/for-each";
await forEach([1, 2, 3], (v) => console.log(v));
// 1
// 2
// 3
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { forEach } from "@core/iterutil/pipe/for-each";
pipe(
[1, 2, 3],
forEach((v) => console.log(v)),
);
// 1
// 2
// 3
import { pipe } from "@core/pipe";
import { forEach } from "@core/iterutil/pipe/async/for-each";
await pipe(
[1, 2, 3],
forEach((v) => console.log(v)),
);
// 1
// 2
// 3
Converts an iterable to an iterator.
import { iter } from "@core/iterutil/iter";
const it = iter([1, 2, 3, 4, 5]);
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
for (const value of it) {
console.log(value);
}
// 3
// 4
// 5
import { iter } from "@core/iterutil/async/iter";
const it = iter([1, 2, 3, 4, 5]);
console.log(await it.next()); // { value: 1, done: false }
console.log(await it.next()); // { value: 2, done: false }
for await (const value of it) {
console.log(value);
}
// 3
// 4
// 5
Returns the last element of an iterable.
import { last } from "@core/iterutil/last";
console.log(last([1, 2, 3])); // 3
console.log(last([])); // undefined
import { last } from "@core/iterutil/async/last";
console.log(await last([1, 2, 3])); // 3
console.log(await last([])); // undefined
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { last } from "@core/iterutil/pipe/last";
console.log(pipe([1, 2, 3], last)); // 3
console.log(pipe([], last)); // undefined
import { pipe } from "@core/pipe";
import { last } from "@core/iterutil/pipe/async/last";
console.log(await pipe([1, 2, 3], last)); // 3
console.log(await pipe([], last)); // undefined
Maps an iterable with a function.
import { map } from "@core/iterutil/map";
const iter = map(
[1, 2, 3],
(v) => v * 2,
);
console.log(Array.from(iter)); // [2, 4, 6]
import { map } from "@core/iterutil/async/map";
const iter = map(
[1, 2, 3],
(v) => v * 2,
);
console.log(await Array.fromAsync(iter)); // [2, 4, 6]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { map } from "@core/iterutil/pipe/map";
const iter = pipe(
[1, 2, 3],
map((v) => v * 2),
);
console.log(Array.from(iter)); // [2, 4, 6]
import { pipe } from "@core/pipe";
import { map } from "@core/iterutil/pipe/async/map";
const iter = pipe(
[1, 2, 3],
map((v) => v * 2),
);
console.log(await Array.fromAsync(iter)); // [2, 4, 6]
Returns the n-th element of an iterable. If the length of the iterable is less,
returns undefined
.
import { nth } from "@core/iterutil/nth";
const result = nth([1, 2, 3], 1);
console.log(result); // 2
import { nth } from "@core/iterutil/async/nth";
const result = await nth([1, 2, 3], 1);
console.log(result); // 2
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { nth } from "@core/iterutil/pipe/nth";
const result = pipe([1, 2, 3], nth(1));
console.log(result); // 2
import { pipe } from "@core/pipe";
import { nth } from "@core/iterutil/pipe/async/nth";
const result = await pipe([1, 2, 3], nth(1));
console.log(result); // 2
Returns an iterable that pairs adjacent elements from the input iterable.
import { pairwise } from "@core/iterutil/pairwise";
const iter = pairwise([1, 2, 3, 4, 5]);
console.log(Array.from(iter)); // [[1, 2], [2, 3], [3, 4], [4, 5]]
import { pairwise } from "@core/iterutil/async/pairwise";
const iter = pairwise([1, 2, 3, 4, 5]);
console.log(await Array.fromAsync(iter)); // [[1, 2], [2, 3], [3, 4], [4, 5]]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { pairwise } from "@core/iterutil/pipe/pairwise";
const iter = pipe(
[1, 2, 3, 4, 5],
pairwise,
);
console.log(Array.from(iter)); // [[1, 2], [2, 3], [3, 4], [4, 5]]
import { pipe } from "@core/pipe";
import { pairwise } from "@core/iterutil/pipe/async/pairwise";
const iter = pipe(
[1, 2, 3, 4, 5],
pairwise,
);
console.log(await Array.fromAsync(iter)); // [[1, 2], [2, 3], [3, 4], [4, 5]]
Partitions an iterable into two arrays based on a selector function.
import { partition } from "@core/iterutil/partition";
const [even, odd] = partition(
[1, 2, 3, 4, 5],
(v) => v % 2 === 0,
);
console.log(even); // [2, 4]
console.log(odd); // [1, 3, 5]
import { partition } from "@core/iterutil/async/partition";
const [even, odd] = await partition(
[1, 2, 3, 4, 5],
(v) => v % 2 === 0,
);
console.log(even); // [2, 4]
console.log(odd); // [1, 3, 5]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { partition } from "@core/iterutil/pipe/partition";
const [even, odd] = pipe(
[1, 2, 3, 4, 5],
partition((v) => v % 2 === 0),
);
console.log(even); // [2, 4]
console.log(odd); // [1, 3, 5]
import { pipe } from "@core/pipe";
import { partition } from "@core/iterutil/pipe/async/partition";
const [even, odd] = await pipe(
[1, 2, 3, 4, 5],
partition((v) => v % 2 === 0),
);
console.log(even); // [2, 4]
console.log(odd); // [1, 3, 5]
Generates a range of numbers.
import { range } from "@core/iterutil/range";
console.log(Array.from(range(1, 3))); // [1, 2, 3]
console.log(Array.from(range(1, 6, 2))); // [1, 3, 5]
Reduces an iterable into a single value.
import { reduce } from "@core/iterutil/reduce";
const sum = reduce(
[1, 2, 3, 4, 5],
(acc, v) => acc + v,
);
console.log(sum); // 15
const joined = reduce(
[1, 2, 3, 4, 5],
(acc, v) => acc + v,
"",
);
console.log(joined); // 12345
import { reduce } from "@core/iterutil/async/reduce";
const sum = await reduce(
[1, 2, 3, 4, 5],
(acc, v) => acc + v,
);
console.log(sum); // 15
const joined = await reduce(
[1, 2, 3, 4, 5],
(acc, v) => acc + v,
"",
);
console.log(joined); // 12345
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { reduce } from "@core/iterutil/pipe/reduce";
const sum = pipe(
[1, 2, 3, 4, 5],
reduce((acc, v) => acc + v),
);
console.log(sum); // 15
const joined = pipe(
[1, 2, 3, 4, 5],
reduce((acc, v) => acc + v, ""),
);
console.log(joined); // 12345
import { pipe } from "@core/pipe";
import { reduce } from "@core/iterutil/pipe/async/reduce";
const sum = await pipe(
[1, 2, 3, 4, 5],
reduce((acc, v) => acc + v),
);
console.log(sum); // 15
const joined = await pipe(
[1, 2, 3, 4, 5],
reduce((acc, v) => acc + v, ""),
);
console.log(joined); // 12345
Returns an finite iterable that repeats through the given iterable.
import { repeat } from "@core/iterutil/repeat";
const iter = repeat([1, 2, 3], 2);
console.log(Array.from(iter)); // [1, 2, 3, 1, 2, 3]
import { repeat } from "@core/iterutil/async/repeat";
const iter = repeat([1, 2, 3], 2);
console.log(await Array.fromAsync(iter)); // [1, 2, 3, 1, 2, 3]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { repeat } from "@core/iterutil/pipe/repeat";
const iter = pipe(
[1, 2, 3],
repeat(2),
);
console.log(Array.from(iter)); // [1, 2, 3, 1, 2, 3]
import { pipe } from "@core/pipe";
import { repeat } from "@core/iterutil/pipe/async/repeat";
const iter = pipe(
[1, 2, 3],
repeat(2),
);
console.log(await Array.fromAsync(iter)); // [1, 2, 3, 1, 2, 3]
Transform an async iterable into a repeatable async iterable. It caches the values of the original iterable so that it can be replayed. Useful for replaying the costly async iterable.
import { repeatable } from "@core/iterutil/async/repeatable";
import { assertEquals } from "@std/assert";
const origin = (async function* () {
yield 1;
yield 2;
yield 3;
})();
const iter = repeatable(origin);
assertEquals(await Array.fromAsync(iter), [1, 2, 3]);
assertEquals(await Array.fromAsync(iter), [1, 2, 3]); // iter can be replayed
assertEquals(await Array.fromAsync(origin), []); // origin is already consumed
Returns true if at least one element in the iterable satisfies the provided
import { some } from "@core/iterutil/some";
console.log(some([1, 2, 3], (v) => v % 2 === 0)); // true
console.log(some([1, 3, 5], (v) => v % 2 === 0)); // false
import { some } from "@core/iterutil/async/some";
console.log(await some([1, 2, 3], (v) => v % 2 === 0)); // true
console.log(await some([1, 3, 5], (v) => v % 2 === 0)); // false
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { some } from "@core/iterutil/pipe/some";
console.log(pipe([1, 2, 3], some((v) => v % 2 === 0))); // true
console.log(pipe([1, 3, 5], some((v) => v % 2 === 0))); // false
import { pipe } from "@core/pipe";
import { some } from "@core/iterutil/pipe/async/some";
console.log(await pipe([1, 2, 3], some((v) => v % 2 === 0))); // true
console.log(await pipe([1, 3, 5], some((v) => v % 2 === 0))); // false
Takes the first limit
items from the iterable.
import { take } from "@core/iterutil/take";
const iter = take([1, 2, 3, 4, 5], 2);
console.log(Array.from(iter)); // [1, 2]
import { take } from "@core/iterutil/async/take";
const iter = take([1, 2, 3, 4, 5], 2);
console.log(await Array.fromAsync(iter)); // [1, 2]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { take } from "@core/iterutil/pipe/take";
const iter = pipe(
[1, 2, 3, 4, 5],
take(2),
);
console.log(Array.from(iter)); // [1, 2]
import { pipe } from "@core/pipe";
import { take } from "@core/iterutil/pipe/async/take";
const iter = pipe(
[1, 2, 3, 4, 5],
take(2),
);
console.log(await Array.fromAsync(iter)); // [1, 2]
Takes elements from the iterable while the predicate is true.
import { takeWhile } from "@core/iterutil/take-while";
const iter = takeWhile(
[1, 2, 3, 4, 5],
(v) => v < 4,
);
console.log(Array.from(iter)); // [1, 2, 3]
import { takeWhile } from "@core/iterutil/async/take-while";
const iter = takeWhile(
[1, 2, 3, 4, 5],
(v) => v < 4,
);
console.log(await Array.fromAsync(iter)); // [1, 2, 3]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { takeWhile } from "@core/iterutil/pipe/take-while";
const iter = pipe(
[1, 2, 3, 4, 5],
takeWhile((v) => v < 4),
);
console.log(Array.from(iter)); // [1, 2, 3]
import { pipe } from "@core/pipe";
import { takeWhile } from "@core/iterutil/pipe/async/take-while";
const iter = pipe(
[1, 2, 3, 4, 5],
takeWhile((v) => v < 4),
);
console.log(await Array.fromAsync(iter)); // [1, 2, 3]
Converts an iterable to an async iterable.
import { toAsyncIterable } from "@core/iterutil/async/to-async-iterable";
const iter = toAsyncIterable([1, 2, 3]);
console.log(await Array.fromAsync(iter)); // [1, 2, 3]
Returns an iterable that yields the unique elements of the input iterable.
import { uniq } from "@core/iterutil/uniq";
const iter1 = uniq([1, 2, 2, 3, 3, 3]);
console.log(Array.from(iter1)); // [1, 2, 3]
const iter2 = uniq(
[1, 2, 3, 4, 5, 6, 7, 8, 9],
(v) => v % 4,
);
console.log(Array.from(iter2)); // [1, 2, 3, 4]
import { uniq } from "@core/iterutil/async/uniq";
const iter1 = uniq([1, 2, 2, 3, 3, 3]);
console.log(await Array.fromAsync(iter1)); // [1, 2, 3]
const iter2 = uniq(
[1, 2, 3, 4, 5, 6, 7, 8, 9],
(v) => v % 4,
);
console.log(await Array.fromAsync(iter2)); // [1, 2, 3, 4]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { uniq } from "@core/iterutil/pipe/uniq";
const iter1 = pipe(
[1, 2, 2, 3, 3, 3],
uniq(),
);
console.log(Array.from(iter1)); // [1, 2, 3]
const iter2 = pipe(
[1, 2, 3, 4, 5, 6, 7, 8, 9],
uniq((v) => v % 4),
);
console.log(Array.from(iter2)); // [1, 2, 3, 4]
import { pipe } from "@core/pipe";
import { uniq } from "@core/iterutil/pipe/async/uniq";
const iter1 = pipe(
[1, 2, 2, 3, 3, 3],
uniq(),
);
console.log(await Array.fromAsync(iter1)); // [1, 2, 3]
const iter2 = pipe(
[1, 2, 3, 4, 5, 6, 7, 8, 9],
uniq((v) => v % 4),
);
console.log(await Array.fromAsync(iter2)); // [1, 2, 3, 4]
Zips multiple iterables into a single iterable.
import { zip } from "@core/iterutil/zip";
const iter = zip([1, 2, 3], ["a", "b", "c"]);
console.log(Array.from(iter)); // [[1, "a"], [2, "b"], [3, "c"]]
import { zip } from "@core/iterutil/async/zip";
const iter = zip([1, 2, 3], ["a", "b", "c"]);
console.log(await Array.fromAsync(iter)); // [[1, "a"], [2, "b"], [3, "c"]]
Use pipe
and pipe/async
modules for @core/pipe package like.
import { pipe } from "@core/pipe";
import { zip } from "@core/iterutil/pipe/zip";
const iter = pipe(
[1, 2, 3],
zip(["a", "b", "c"]),
);
console.log(Array.from(iter)); // [[1, "a"], [2, "b"], [3, "c"]]
import { pipe } from "@core/pipe";
import { zip } from "@core/iterutil/pipe/async/zip";
const iter = pipe(
[1, 2, 3],
zip(["a", "b", "c"]),
);
console.log(await Array.fromAsync(iter)); // [[1, "a"], [2, "b"], [3, "c"]]
The code follows MIT license written in LICENSE. Contributors need to agree that any modifications sent in this repository follow the license.