https://github.com/jsr-core/iterutil
Iterator / AsyncIterator utility pack for JavaScript / TypeScript
https://github.com/jsr-core/iterutil
asynciterator iterator javascript jsr typescript
Last synced: 18 days ago
JSON representation
Iterator / AsyncIterator utility pack for JavaScript / TypeScript
- Host: GitHub
- URL: https://github.com/jsr-core/iterutil
- Owner: jsr-core
- License: mit
- Created: 2024-08-07T14:56:57.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2024-10-14T15:52:05.000Z (6 months ago)
- Last Synced: 2025-03-23T18:04:45.999Z (about 1 month ago)
- Topics: asynciterator, iterator, javascript, jsr, typescript
- Language: TypeScript
- Homepage: https://jsr.io/@core/iterutil
- Size: 231 KB
- Stars: 5
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# iterutil
[](https://jsr.io/@core/iterutil)
[](https://github.com/jsr-core/iterutil/actions?query=workflow%3ATest)
[](https://codecov.io/github/jsr-core/iterutil)Iterator / AsyncIterator utility pack for JavaScript and TypeScript. Each module
is designed to work independently, avoiding internal inter-dependencies as much
as possible.## Usage
To apply single operation to an iterable, use modules under the root.
```ts
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.```ts
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.```ts
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.```ts
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]
```[@core/pipe]: https://jsr.io/@core/pipe
### chain
Chains multiple iterables together.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### chunked
Chunks an iterable into arrays of a given size.
```ts
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]]
``````ts
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.
```ts
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]]
``````ts
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]]
```### compact
Removes all nullish (`null` or `undefined`) values from an iterable.
```ts
import { compact } from "@core/iterutil/compact";const iter = compact([1, undefined, 2, null, 3]);
console.log(Array.from(iter)); // [1, 2, 3]
``````ts
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.
```ts
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]
``````ts
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]
```### compress
Compresses an iterable by selecting elements using a selector iterable.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### count
Generates an infinite sequence of numbers starting from `start` with a step of
`step`.```ts
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]
```### cycle
Returns an infinite iterable that cycles through the given iterable.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### drop
Drops the first `limit` items from the iterable.
```ts
import { drop } from "@core/iterutil/drop";const iter = drop([1, 2, 3, 4, 5], 2);
console.log(Array.from(iter)); // [3, 4, 5]
``````ts
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.
```ts
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]
``````ts
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]
```### dropWhile
Drops elements from the iterable while the predicate returns true.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### enumerate
Enumerates an iterable.
```ts
import { enumerate } from "@core/iterutil/enumerate";const iter = enumerate(["a", "b", "c"]);
console.log(Array.from(iter)); // [[0, "a"], [1, "b"], [2, "c"]]
``````ts
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.
```ts
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"]]
``````ts
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"]]
```### every
Returns true if every element in the iterable satisfies the provided testing
function.```ts
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
``````ts
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.
```ts
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
``````ts
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
```### filter
Filters an iterable based on a function.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### find
Returns the first element in the iterable that satisfies the provided testing
function. Otherwise, undefined is returned.```ts
import { find } from "@core/iterutil/find";const value = find(
[1, 2, 3, 4, 5],
(v) => v % 2 === 0,
);
console.log(value); // 2
``````ts
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.
```ts
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
``````ts
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
```### first
Returns the first element of an iterable. If the iterable is empty, returns
`undefined`.```ts
import { first } from "@core/iterutil/first";const result = first([1, 2, 3]);
console.log(result); // 1
``````ts
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.
```ts
import { pipe } from "@core/pipe";
import { first } from "@core/iterutil/pipe/first";const result = pipe([1, 2, 3], first);
console.log(result); // 1
``````ts
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
```### flatMap
Maps each value in an iterable to an iterable, then flattens the result.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### flatten
Flattens an iterable of iterables into a single iterable.
```ts
import { flatten } from "@core/iterutil/flatten";const iter = flatten([[1, 2], [3, 4], [5]]);
console.log(Array.from(iter)); // [1, 2, 3, 4, 5]
``````ts
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.
```ts
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]
``````ts
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]
```### forEach
Calls a function for each value in an iterable.
```ts
import { forEach } from "@core/iterutil/for-each";
forEach([1, 2, 3], (v) => console.log(v));
// 1
// 2
// 3
``````ts
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.
```ts
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
``````ts
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
```### iter
Converts an iterable to an iterator.
```ts
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
``````ts
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
```### last
Returns the last element of an iterable.
```ts
import { last } from "@core/iterutil/last";console.log(last([1, 2, 3])); // 3
console.log(last([])); // undefined
``````ts
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.
```ts
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
``````ts
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
```### map
Maps an iterable with a function.
```ts
import { map } from "@core/iterutil/map";const iter = map(
[1, 2, 3],
(v) => v * 2,
);
console.log(Array.from(iter)); // [2, 4, 6]
``````ts
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.
```ts
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]
``````ts
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]
```### nth
Returns the n-th element of an iterable. If the length of the iterable is less,
returns `undefined`.```ts
import { nth } from "@core/iterutil/nth";const result = nth([1, 2, 3], 1);
console.log(result); // 2
``````ts
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.
```ts
import { pipe } from "@core/pipe";
import { nth } from "@core/iterutil/pipe/nth";const result = pipe([1, 2, 3], nth(1));
console.log(result); // 2
``````ts
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
```### pairwise
Returns an iterable that pairs adjacent elements from the input iterable.
```ts
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]]
``````ts
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.
```ts
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]]
``````ts
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]]
```### partition
Partitions an iterable into two arrays based on a selector function.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### range
Generates a range of numbers.
```ts
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]
```### reduce
Reduces an iterable into a single value.
```ts
import { reduce } from "@core/iterutil/reduce";const sum = reduce(
[1, 2, 3, 4, 5],
(acc, v) => acc + v,
);
console.log(sum); // 15const joined = reduce(
[1, 2, 3, 4, 5],
(acc, v) => acc + v,
"",
);
console.log(joined); // 12345
``````ts
import { reduce } from "@core/iterutil/async/reduce";const sum = await reduce(
[1, 2, 3, 4, 5],
(acc, v) => acc + v,
);
console.log(sum); // 15const 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.
```ts
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); // 15const joined = pipe(
[1, 2, 3, 4, 5],
reduce((acc, v) => acc + v, ""),
);
console.log(joined); // 12345
``````ts
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); // 15const joined = await pipe(
[1, 2, 3, 4, 5],
reduce((acc, v) => acc + v, ""),
);
console.log(joined); // 12345
```### repeat
Returns an finite iterable that repeats through the given iterable.
```ts
import { repeat } from "@core/iterutil/repeat";const iter = repeat([1, 2, 3], 2);
console.log(Array.from(iter)); // [1, 2, 3, 1, 2, 3]
``````ts
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.
```ts
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]
``````ts
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]
```### repeatable
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.```ts
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
```### some
Returns true if at least one element in the iterable satisfies the provided
```ts
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
``````ts
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.
```ts
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
``````ts
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
```### take
Takes the first `limit` items from the iterable.
```ts
import { take } from "@core/iterutil/take";const iter = take([1, 2, 3, 4, 5], 2);
console.log(Array.from(iter)); // [1, 2]
``````ts
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.
```ts
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]
``````ts
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]
```### takeWhile
Takes elements from the iterable while the predicate is true.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### toAsyncIterable
Converts an iterable to an async iterable.
```ts
import { toAsyncIterable } from "@core/iterutil/async/to-async-iterable";const iter = toAsyncIterable([1, 2, 3]);
console.log(await Array.fromAsync(iter)); // [1, 2, 3]
```### uniq
Returns an iterable that yields the unique elements of the input iterable.
```ts
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]
``````ts
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.
```ts
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]
``````ts
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]
```### zip
Zips multiple iterables into a single iterable.
```ts
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"]]
``````ts
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.
```ts
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"]]
``````ts
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"]]
```## License
The code follows MIT license written in [LICENSE](./LICENSE). Contributors need
to agree that any modifications sent in this repository follow the license.