{"id":21507717,"url":"https://github.com/jsr-core/iterutil","last_synced_at":"2025-04-09T15:50:31.473Z","repository":{"id":252094772,"uuid":"839412962","full_name":"jsr-core/iterutil","owner":"jsr-core","description":"Iterator / AsyncIterator utility pack for JavaScript / TypeScript","archived":false,"fork":false,"pushed_at":"2024-10-14T15:52:05.000Z","size":237,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-23T18:04:45.999Z","etag":null,"topics":["asynciterator","iterator","javascript","jsr","typescript"],"latest_commit_sha":null,"homepage":"https://jsr.io/@core/iterutil","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jsr-core.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["lambdalisue"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"custom":null}},"created_at":"2024-08-07T14:56:57.000Z","updated_at":"2024-10-14T15:51:52.000Z","dependencies_parsed_at":"2024-08-17T06:40:53.755Z","dependency_job_id":null,"html_url":"https://github.com/jsr-core/iterutil","commit_stats":null,"previous_names":["jsr-core/iterutil"],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsr-core%2Fiterutil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsr-core%2Fiterutil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsr-core%2Fiterutil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsr-core%2Fiterutil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jsr-core","download_url":"https://codeload.github.com/jsr-core/iterutil/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248063821,"owners_count":21041854,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asynciterator","iterator","javascript","jsr","typescript"],"created_at":"2024-11-23T20:38:14.035Z","updated_at":"2025-04-09T15:50:31.454Z","avatar_url":"https://github.com/jsr-core.png","language":"TypeScript","funding_links":["https://github.com/sponsors/lambdalisue"],"categories":[],"sub_categories":[],"readme":"# iterutil\n\n[![jsr](https://jsr.io/badges/@core/iterutil)](https://jsr.io/@core/iterutil)\n[![test](https://github.com/jsr-core/iterutil/workflows/Test/badge.svg)](https://github.com/jsr-core/iterutil/actions?query=workflow%3ATest)\n[![codecov](https://codecov.io/github/jsr-core/iterutil/graph/badge.svg?token=pfbLRGU5AM)](https://codecov.io/github/jsr-core/iterutil)\n\nIterator / AsyncIterator utility pack for JavaScript and TypeScript. Each module\nis designed to work independently, avoiding internal inter-dependencies as much\nas possible.\n\n## Usage\n\nTo apply single operation to an iterable, use modules under the root.\n\n```ts\nimport { map } from \"@core/iterutil/map\";\n\nconst iter = map([1, 2, 3], (v) =\u003e v * 2);\nconsole.log(Array.from(iter)); // [2, 4, 6]\n```\n\nTo apply single asynchronous operation to an (async) iterable, use modules under\nthe `async` submodule.\n\n```ts\nimport { map } from \"@core/iterutil/async/map\";\n\nconst iter = map([1, 2, 3], (v) =\u003e Promise.resolve(v * 2));\nconsole.log(await Array.fromAsync(iter)); // [2, 4, 6]\n```\n\nTo apply multiple operations to an iterable, use the modules under the `pipe`\nsubmodule with the [@core/pipe] package.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { cycle } from \"@core/iterutil/pipe/cycle\";\nimport { filter } from \"@core/iterutil/pipe/filter\";\nimport { map } from \"@core/iterutil/pipe/map\";\nimport { take } from \"@core/iterutil/pipe/take\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  map((v) =\u003e v * 2),\n  cycle,\n  take(10),\n  filter((v) =\u003e v % 2 === 0),\n);\nconsole.log(Array.from(iter)); // [2, 4, 6, 2, 4, 6, 2, 4, 6, 2]\n```\n\nTo apply multiple asynchronous operations to an (async) iterable, use the\nmodules under the `pipe/async` submodule with the [@core/pipe] package.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { cycle } from \"@core/iterutil/pipe/async/cycle\";\nimport { filter } from \"@core/iterutil/pipe/async/filter\";\nimport { map } from \"@core/iterutil/pipe/async/map\";\nimport { take } from \"@core/iterutil/pipe/async/take\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  map((v) =\u003e Promise.resolve(v * 2)),\n  cycle,\n  take(10),\n  filter((v) =\u003e Promise.resolve(v % 2 === 0)),\n);\nconsole.log(await Array.fromAsync(iter)); // [2, 4, 6, 2, 4, 6, 2, 4, 6, 2]\n```\n\n[@core/pipe]: https://jsr.io/@core/pipe\n\n### chain\n\nChains multiple iterables together.\n\n```ts\nimport { chain } from \"@core/iterutil/chain\";\n\nconst iter = chain([1, 2], [\"a\", \"b\"], [true, false]);\nconsole.log(Array.from(iter)); // [1, 2, \"a\", \"b\", true, false]\n```\n\n```ts\nimport { chain } from \"@core/iterutil/async/chain\";\n\nconst iter = chain([1, 2], [\"a\", \"b\"], [true, false]);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, \"a\", \"b\", true, false]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { chain } from \"@core/iterutil/pipe/chain\";\n\nconst iter = pipe(\n  [1, 2],\n  chain([\"a\", \"b\"], [true, false]),\n);\nconsole.log(Array.from(iter)); // [1, 2, \"a\", \"b\", true, false]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { chain } from \"@core/iterutil/pipe/async/chain\";\n\nconst iter = pipe(\n  [1, 2],\n  chain([\"a\", \"b\"], [true, false]),\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, \"a\", \"b\", true, false]\n```\n\n### chunked\n\nChunks an iterable into arrays of a given size.\n\n```ts\nimport { chunked } from \"@core/iterutil/chunked\";\n\nconst iter = chunked([1, 2, 3, 4, 5], 2);\nconsole.log(Array.from(iter)); // [[1, 2], [3, 4], [5]]\n```\n\n```ts\nimport { chunked } from \"@core/iterutil/async/chunked\";\n\nconst iter = chunked([1, 2, 3, 4, 5], 2);\nconsole.log(await Array.fromAsync(iter)); // [[1, 2], [3, 4], [5]]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { chunked } from \"@core/iterutil/pipe/chunked\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  chunked(2),\n);\nconsole.log(Array.from(iter)); // [[1, 2], [3, 4], [5]]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { chunked } from \"@core/iterutil/pipe/async/chunked\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  chunked(2),\n);\nconsole.log(await Array.fromAsync(iter)); // [[1, 2], [3, 4], [5]]\n```\n\n### compact\n\nRemoves all nullish (`null` or `undefined`) values from an iterable.\n\n```ts\nimport { compact } from \"@core/iterutil/compact\";\n\nconst iter = compact([1, undefined, 2, null, 3]);\nconsole.log(Array.from(iter)); // [1, 2, 3]\n```\n\n```ts\nimport { compact } from \"@core/iterutil/async/compact\";\n\nconst iter = compact([1, undefined, 2, null, 3]);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { compact } from \"@core/iterutil/pipe/compact\";\n\nconst iter = pipe(\n  [1, undefined, 2, null, 3],\n  compact,\n);\nconsole.log(Array.from(iter)); // [1, 2, 3]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { compact } from \"@core/iterutil/pipe/async/compact\";\n\nconst iter = pipe(\n  [1, undefined, 2, null, 3],\n  compact,\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3]\n```\n\n### compress\n\nCompresses an iterable by selecting elements using a selector iterable.\n\n```ts\nimport { compress } from \"@core/iterutil/compress\";\n\nconst iter = compress(\n  [1, 2, 3, 4, 5],\n  [true, false, true, false, true],\n);\nconsole.log(Array.from(iter)); // [1, 3, 5]\n```\n\n```ts\nimport { compress } from \"@core/iterutil/async/compress\";\n\nconst iter = compress(\n  [1, 2, 3, 4, 5],\n  [true, false, true, false, true],\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 3, 5]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { compress } from \"@core/iterutil/pipe/compress\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  compress([true, false, true, false, true]),\n);\nconsole.log(Array.from(iter)); // [1, 3, 5]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { compress } from \"@core/iterutil/pipe/async/compress\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  compress([true, false, true, false, true]),\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 3, 5]\n```\n\n### count\n\nGenerates an infinite sequence of numbers starting from `start` with a step of\n`step`.\n\n```ts\nimport { count } from \"@core/iterutil/count\";\nimport { take } from \"@core/iterutil/take\";\n\nconst iter = count(1, 2);\nconsole.log(Array.from(take(iter, 5))); // [1, 3, 5, 7, 9]\n```\n\n### cycle\n\nReturns an infinite iterable that cycles through the given iterable.\n\n```ts\nimport { cycle } from \"@core/iterutil/cycle\";\nimport { take } from \"@core/iterutil/take\";\n\nconst iter = cycle([1, 2, 3]);\nconsole.log(Array.from(take(iter, 5))); // [1, 2, 3, 1, 2]\n```\n\n```ts\nimport { cycle } from \"@core/iterutil/async/cycle\";\nimport { take } from \"@core/iterutil/async/take\";\n\nconst iter = cycle([1, 2, 3]);\nconsole.log(await Array.fromAsync(take(iter, 5))); // [1, 2, 3, 1, 2]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { cycle } from \"@core/iterutil/pipe/cycle\";\nimport { take } from \"@core/iterutil/pipe/take\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  cycle,\n  take(5),\n);\nconsole.log(Array.from(iter)); // [1, 2, 3, 1, 2]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { cycle } from \"@core/iterutil/pipe/async/cycle\";\nimport { take } from \"@core/iterutil/pipe/async/take\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  cycle,\n  take(5),\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3, 1, 2]\n```\n\n### drop\n\nDrops the first `limit` items from the iterable.\n\n```ts\nimport { drop } from \"@core/iterutil/drop\";\n\nconst iter = drop([1, 2, 3, 4, 5], 2);\nconsole.log(Array.from(iter)); // [3, 4, 5]\n```\n\n```ts\nimport { drop } from \"@core/iterutil/async/drop\";\n\nconst iter = drop([1, 2, 3, 4, 5], 2);\nconsole.log(await Array.fromAsync(iter)); // [3, 4, 5]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { drop } from \"@core/iterutil/pipe/drop\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  drop(2),\n);\nconsole.log(Array.from(iter)); // [3, 4, 5]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { drop } from \"@core/iterutil/pipe/async/drop\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  drop(2),\n);\nconsole.log(await Array.fromAsync(iter)); // [3, 4, 5]\n```\n\n### dropWhile\n\nDrops elements from the iterable while the predicate returns true.\n\n```ts\nimport { dropWhile } from \"@core/iterutil/drop-while\";\n\nconst iter = dropWhile(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v \u003c 3,\n);\nconsole.log(Array.from(iter)); // [3, 4, 5]\n```\n\n```ts\nimport { dropWhile } from \"@core/iterutil/async/drop-while\";\n\nconst iter = dropWhile(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v \u003c 3,\n);\nconsole.log(await Array.fromAsync(iter)); // [3, 4, 5]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { dropWhile } from \"@core/iterutil/pipe/drop-while\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  dropWhile((v) =\u003e v \u003c 3),\n);\nconsole.log(Array.from(iter)); // [3, 4, 5]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { dropWhile } from \"@core/iterutil/pipe/async/drop-while\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  dropWhile((v) =\u003e v \u003c 3),\n);\nconsole.log(await Array.fromAsync(iter)); // [3, 4, 5]\n```\n\n### enumerate\n\nEnumerates an iterable.\n\n```ts\nimport { enumerate } from \"@core/iterutil/enumerate\";\n\nconst iter = enumerate([\"a\", \"b\", \"c\"]);\nconsole.log(Array.from(iter)); // [[0, \"a\"], [1, \"b\"], [2, \"c\"]]\n```\n\n```ts\nimport { enumerate } from \"@core/iterutil/async/enumerate\";\n\nconst iter = enumerate([\"a\", \"b\", \"c\"]);\nconsole.log(await Array.fromAsync(iter)); // [[0, \"a\"], [1, \"b\"], [2, \"c\"]]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { enumerate } from \"@core/iterutil/pipe/enumerate\";\n\nconst iter = pipe([\"a\", \"b\", \"c\"], enumerate);\nconsole.log(Array.from(iter)); // [[0, \"a\"], [1, \"b\"], [2, \"c\"]]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { enumerate } from \"@core/iterutil/pipe/async/enumerate\";\n\nconst iter = pipe([\"a\", \"b\", \"c\"], enumerate);\nconsole.log(await Array.fromAsync(iter)); // [[0, \"a\"], [1, \"b\"], [2, \"c\"]]\n```\n\n### every\n\nReturns true if every element in the iterable satisfies the provided testing\nfunction.\n\n```ts\nimport { every } from \"@core/iterutil/every\";\n\nconsole.log(every([1, 2, 3], (v) =\u003e v \u003e 0)); // true\nconsole.log(every([1, 2, 3], (v) =\u003e v \u003e 1)); // false\n```\n\n```ts\nimport { every } from \"@core/iterutil/async/every\";\n\nconsole.log(await every([1, 2, 3], (v) =\u003e v \u003e 0)); // true\nconsole.log(await every([1, 2, 3], (v) =\u003e v \u003e 1)); // false\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { every } from \"@core/iterutil/pipe/every\";\n\nconsole.log(pipe([1, 2, 3], every((v) =\u003e v \u003e 0))); // true\nconsole.log(pipe([1, 2, 3], every((v) =\u003e v \u003e 1))); // false\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { every } from \"@core/iterutil/pipe/async/every\";\n\nconsole.log(await pipe([1, 2, 3], every((v) =\u003e v \u003e 0))); // true\nconsole.log(await pipe([1, 2, 3], every((v) =\u003e v \u003e 1))); // false\n```\n\n### filter\n\nFilters an iterable based on a function.\n\n```ts\nimport { filter } from \"@core/iterutil/filter\";\n\nconst iter = filter(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v % 2 === 0,\n);\nconsole.log(Array.from(iter)); // [2, 4]\n```\n\n```ts\nimport { filter } from \"@core/iterutil/async/filter\";\n\nconst iter = filter(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v % 2 === 0,\n);\nconsole.log(await Array.fromAsync(iter)); // [2, 4]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { filter } from \"@core/iterutil/pipe/filter\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  filter((v) =\u003e v % 2 === 0),\n);\nconsole.log(Array.from(iter)); // [2, 4]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { filter } from \"@core/iterutil/pipe/async/filter\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  filter((v) =\u003e v % 2 === 0),\n);\nconsole.log(await Array.fromAsync(iter)); // [2, 4]\n```\n\n### find\n\nReturns the first element in the iterable that satisfies the provided testing\nfunction. Otherwise, undefined is returned.\n\n```ts\nimport { find } from \"@core/iterutil/find\";\n\nconst value = find(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v % 2 === 0,\n);\nconsole.log(value); // 2\n```\n\n```ts\nimport { find } from \"@core/iterutil/async/find\";\n\nconst value = await find(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v % 2 === 0,\n);\nconsole.log(value); // 2\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { find } from \"@core/iterutil/pipe/find\";\n\nconst value = pipe(\n  [1, 2, 3, 4, 5],\n  find((v) =\u003e v % 2 === 0),\n);\nconsole.log(value); // 2\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { find } from \"@core/iterutil/pipe/async/find\";\n\nconst value = await pipe(\n  [1, 2, 3, 4, 5],\n  find((v) =\u003e v % 2 === 0),\n);\nconsole.log(value); // 2\n```\n\n### first\n\nReturns the first element of an iterable. If the iterable is empty, returns\n`undefined`.\n\n```ts\nimport { first } from \"@core/iterutil/first\";\n\nconst result = first([1, 2, 3]);\nconsole.log(result); // 1\n```\n\n```ts\nimport { first } from \"@core/iterutil/async/first\";\n\nconst result = await first([1, 2, 3]);\nconsole.log(result); // 1\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { first } from \"@core/iterutil/pipe/first\";\n\nconst result = pipe([1, 2, 3], first);\nconsole.log(result); // 1\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { first } from \"@core/iterutil/pipe/async/first\";\n\nconst result = await pipe([1, 2, 3], first);\nconsole.log(result); // 1\n```\n\n### flatMap\n\nMaps each value in an iterable to an iterable, then flattens the result.\n\n```ts\nimport { flatMap } from \"@core/iterutil/flat-map\";\n\nconst iter = flatMap(\n  [1, 2, 3],\n  (v) =\u003e [v, v],\n);\nconsole.log(Array.from(iter)); // [1, 1, 2, 2, 3, 3]\n```\n\n```ts\nimport { flatMap } from \"@core/iterutil/async/flat-map\";\n\nconst iter = flatMap(\n  [1, 2, 3],\n  (v) =\u003e [v, v],\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 1, 2, 2, 3, 3]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { flatMap } from \"@core/iterutil/pipe/flat-map\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  flatMap((v) =\u003e [v, v]),\n);\nconsole.log(Array.from(iter)); // [1, 1, 2, 2, 3, 3]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { flatMap } from \"@core/iterutil/pipe/async/flat-map\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  flatMap((v) =\u003e [v, v]),\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 1, 2, 2, 3, 3]\n```\n\n### flatten\n\nFlattens an iterable of iterables into a single iterable.\n\n```ts\nimport { flatten } from \"@core/iterutil/flatten\";\n\nconst iter = flatten([[1, 2], [3, 4], [5]]);\nconsole.log(Array.from(iter)); // [1, 2, 3, 4, 5]\n```\n\n```ts\nimport { flatten } from \"@core/iterutil/async/flatten\";\n\nconst iter = flatten([[1, 2], [3, 4], [5]]);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3, 4, 5]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { flatten } from \"@core/iterutil/pipe/flatten\";\n\nconst iter = pipe(\n  [[1, 2], [3, 4], [5]],\n  flatten,\n);\nconsole.log(Array.from(iter)); // [1, 2, 3, 4, 5]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { flatten } from \"@core/iterutil/pipe/async/flatten\";\n\nconst iter = pipe(\n  [[1, 2], [3, 4], [5]],\n  flatten,\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3, 4, 5]\n```\n\n### forEach\n\nCalls a function for each value in an iterable.\n\n```ts\nimport { forEach } from \"@core/iterutil/for-each\";\nforEach([1, 2, 3], (v) =\u003e console.log(v));\n// 1\n// 2\n// 3\n```\n\n```ts\nimport { forEach } from \"@core/iterutil/async/for-each\";\nawait forEach([1, 2, 3], (v) =\u003e console.log(v));\n// 1\n// 2\n// 3\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { forEach } from \"@core/iterutil/pipe/for-each\";\npipe(\n  [1, 2, 3],\n  forEach((v) =\u003e console.log(v)),\n);\n// 1\n// 2\n// 3\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { forEach } from \"@core/iterutil/pipe/async/for-each\";\nawait pipe(\n  [1, 2, 3],\n  forEach((v) =\u003e console.log(v)),\n);\n// 1\n// 2\n// 3\n```\n\n### iter\n\nConverts an iterable to an iterator.\n\n```ts\nimport { iter } from \"@core/iterutil/iter\";\n\nconst it = iter([1, 2, 3, 4, 5]);\nconsole.log(it.next()); // { value: 1, done: false }\nconsole.log(it.next()); // { value: 2, done: false }\n\nfor (const value of it) {\n  console.log(value);\n}\n// 3\n// 4\n// 5\n```\n\n```ts\nimport { iter } from \"@core/iterutil/async/iter\";\n\nconst it = iter([1, 2, 3, 4, 5]);\nconsole.log(await it.next()); // { value: 1, done: false }\nconsole.log(await it.next()); // { value: 2, done: false }\n\nfor await (const value of it) {\n  console.log(value);\n}\n// 3\n// 4\n// 5\n```\n\n### last\n\nReturns the last element of an iterable.\n\n```ts\nimport { last } from \"@core/iterutil/last\";\n\nconsole.log(last([1, 2, 3])); // 3\nconsole.log(last([])); // undefined\n```\n\n```ts\nimport { last } from \"@core/iterutil/async/last\";\n\nconsole.log(await last([1, 2, 3])); // 3\nconsole.log(await last([])); // undefined\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { last } from \"@core/iterutil/pipe/last\";\n\nconsole.log(pipe([1, 2, 3], last)); // 3\nconsole.log(pipe([], last)); // undefined\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { last } from \"@core/iterutil/pipe/async/last\";\n\nconsole.log(await pipe([1, 2, 3], last)); // 3\nconsole.log(await pipe([], last)); // undefined\n```\n\n### map\n\nMaps an iterable with a function.\n\n```ts\nimport { map } from \"@core/iterutil/map\";\n\nconst iter = map(\n  [1, 2, 3],\n  (v) =\u003e v * 2,\n);\nconsole.log(Array.from(iter)); // [2, 4, 6]\n```\n\n```ts\nimport { map } from \"@core/iterutil/async/map\";\n\nconst iter = map(\n  [1, 2, 3],\n  (v) =\u003e v * 2,\n);\nconsole.log(await Array.fromAsync(iter)); // [2, 4, 6]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { map } from \"@core/iterutil/pipe/map\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  map((v) =\u003e v * 2),\n);\nconsole.log(Array.from(iter)); // [2, 4, 6]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { map } from \"@core/iterutil/pipe/async/map\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  map((v) =\u003e v * 2),\n);\nconsole.log(await Array.fromAsync(iter)); // [2, 4, 6]\n```\n\n### nth\n\nReturns the n-th element of an iterable. If the length of the iterable is less,\nreturns `undefined`.\n\n```ts\nimport { nth } from \"@core/iterutil/nth\";\n\nconst result = nth([1, 2, 3], 1);\nconsole.log(result); // 2\n```\n\n```ts\nimport { nth } from \"@core/iterutil/async/nth\";\n\nconst result = await nth([1, 2, 3], 1);\nconsole.log(result); // 2\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { nth } from \"@core/iterutil/pipe/nth\";\n\nconst result = pipe([1, 2, 3], nth(1));\nconsole.log(result); // 2\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { nth } from \"@core/iterutil/pipe/async/nth\";\n\nconst result = await pipe([1, 2, 3], nth(1));\nconsole.log(result); // 2\n```\n\n### pairwise\n\nReturns an iterable that pairs adjacent elements from the input iterable.\n\n```ts\nimport { pairwise } from \"@core/iterutil/pairwise\";\n\nconst iter = pairwise([1, 2, 3, 4, 5]);\nconsole.log(Array.from(iter)); // [[1, 2], [2, 3], [3, 4], [4, 5]]\n```\n\n```ts\nimport { pairwise } from \"@core/iterutil/async/pairwise\";\n\nconst iter = pairwise([1, 2, 3, 4, 5]);\nconsole.log(await Array.fromAsync(iter)); // [[1, 2], [2, 3], [3, 4], [4, 5]]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { pairwise } from \"@core/iterutil/pipe/pairwise\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  pairwise,\n);\nconsole.log(Array.from(iter)); // [[1, 2], [2, 3], [3, 4], [4, 5]]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { pairwise } from \"@core/iterutil/pipe/async/pairwise\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  pairwise,\n);\nconsole.log(await Array.fromAsync(iter)); // [[1, 2], [2, 3], [3, 4], [4, 5]]\n```\n\n### partition\n\nPartitions an iterable into two arrays based on a selector function.\n\n```ts\nimport { partition } from \"@core/iterutil/partition\";\n\nconst [even, odd] = partition(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v % 2 === 0,\n);\nconsole.log(even); // [2, 4]\nconsole.log(odd); // [1, 3, 5]\n```\n\n```ts\nimport { partition } from \"@core/iterutil/async/partition\";\n\nconst [even, odd] = await partition(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v % 2 === 0,\n);\nconsole.log(even); // [2, 4]\nconsole.log(odd); // [1, 3, 5]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { partition } from \"@core/iterutil/pipe/partition\";\n\nconst [even, odd] = pipe(\n  [1, 2, 3, 4, 5],\n  partition((v) =\u003e v % 2 === 0),\n);\nconsole.log(even); // [2, 4]\nconsole.log(odd); // [1, 3, 5]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { partition } from \"@core/iterutil/pipe/async/partition\";\n\nconst [even, odd] = await pipe(\n  [1, 2, 3, 4, 5],\n  partition((v) =\u003e v % 2 === 0),\n);\nconsole.log(even); // [2, 4]\nconsole.log(odd); // [1, 3, 5]\n```\n\n### range\n\nGenerates a range of numbers.\n\n```ts\nimport { range } from \"@core/iterutil/range\";\n\nconsole.log(Array.from(range(1, 3))); // [1, 2, 3]\nconsole.log(Array.from(range(1, 6, 2))); // [1, 3, 5]\n```\n\n### reduce\n\nReduces an iterable into a single value.\n\n```ts\nimport { reduce } from \"@core/iterutil/reduce\";\n\nconst sum = reduce(\n  [1, 2, 3, 4, 5],\n  (acc, v) =\u003e acc + v,\n);\nconsole.log(sum); // 15\n\nconst joined = reduce(\n  [1, 2, 3, 4, 5],\n  (acc, v) =\u003e acc + v,\n  \"\",\n);\nconsole.log(joined); // 12345\n```\n\n```ts\nimport { reduce } from \"@core/iterutil/async/reduce\";\n\nconst sum = await reduce(\n  [1, 2, 3, 4, 5],\n  (acc, v) =\u003e acc + v,\n);\nconsole.log(sum); // 15\n\nconst joined = await reduce(\n  [1, 2, 3, 4, 5],\n  (acc, v) =\u003e acc + v,\n  \"\",\n);\nconsole.log(joined); // 12345\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { reduce } from \"@core/iterutil/pipe/reduce\";\n\nconst sum = pipe(\n  [1, 2, 3, 4, 5],\n  reduce((acc, v) =\u003e acc + v),\n);\nconsole.log(sum); // 15\n\nconst joined = pipe(\n  [1, 2, 3, 4, 5],\n  reduce((acc, v) =\u003e acc + v, \"\"),\n);\nconsole.log(joined); // 12345\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { reduce } from \"@core/iterutil/pipe/async/reduce\";\n\nconst sum = await pipe(\n  [1, 2, 3, 4, 5],\n  reduce((acc, v) =\u003e acc + v),\n);\nconsole.log(sum); // 15\n\nconst joined = await pipe(\n  [1, 2, 3, 4, 5],\n  reduce((acc, v) =\u003e acc + v, \"\"),\n);\nconsole.log(joined); // 12345\n```\n\n### repeat\n\nReturns an finite iterable that repeats through the given iterable.\n\n```ts\nimport { repeat } from \"@core/iterutil/repeat\";\n\nconst iter = repeat([1, 2, 3], 2);\nconsole.log(Array.from(iter)); // [1, 2, 3, 1, 2, 3]\n```\n\n```ts\nimport { repeat } from \"@core/iterutil/async/repeat\";\n\nconst iter = repeat([1, 2, 3], 2);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3, 1, 2, 3]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { repeat } from \"@core/iterutil/pipe/repeat\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  repeat(2),\n);\nconsole.log(Array.from(iter)); // [1, 2, 3, 1, 2, 3]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { repeat } from \"@core/iterutil/pipe/async/repeat\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  repeat(2),\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3, 1, 2, 3]\n```\n\n### repeatable\n\nTransform an async iterable into a repeatable async iterable. It caches the\nvalues of the original iterable so that it can be replayed. Useful for replaying\nthe costly async iterable.\n\n```ts\nimport { repeatable } from \"@core/iterutil/async/repeatable\";\nimport { assertEquals } from \"@std/assert\";\n\nconst origin = (async function* () {\n  yield 1;\n  yield 2;\n  yield 3;\n})();\nconst iter = repeatable(origin);\nassertEquals(await Array.fromAsync(iter), [1, 2, 3]);\nassertEquals(await Array.fromAsync(iter), [1, 2, 3]); // iter can be replayed\nassertEquals(await Array.fromAsync(origin), []); // origin is already consumed\n```\n\n### some\n\nReturns true if at least one element in the iterable satisfies the provided\n\n```ts\nimport { some } from \"@core/iterutil/some\";\n\nconsole.log(some([1, 2, 3], (v) =\u003e v % 2 === 0)); // true\nconsole.log(some([1, 3, 5], (v) =\u003e v % 2 === 0)); // false\n```\n\n```ts\nimport { some } from \"@core/iterutil/async/some\";\n\nconsole.log(await some([1, 2, 3], (v) =\u003e v % 2 === 0)); // true\nconsole.log(await some([1, 3, 5], (v) =\u003e v % 2 === 0)); // false\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { some } from \"@core/iterutil/pipe/some\";\n\nconsole.log(pipe([1, 2, 3], some((v) =\u003e v % 2 === 0))); // true\nconsole.log(pipe([1, 3, 5], some((v) =\u003e v % 2 === 0))); // false\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { some } from \"@core/iterutil/pipe/async/some\";\n\nconsole.log(await pipe([1, 2, 3], some((v) =\u003e v % 2 === 0))); // true\nconsole.log(await pipe([1, 3, 5], some((v) =\u003e v % 2 === 0))); // false\n```\n\n### take\n\nTakes the first `limit` items from the iterable.\n\n```ts\nimport { take } from \"@core/iterutil/take\";\n\nconst iter = take([1, 2, 3, 4, 5], 2);\nconsole.log(Array.from(iter)); // [1, 2]\n```\n\n```ts\nimport { take } from \"@core/iterutil/async/take\";\n\nconst iter = take([1, 2, 3, 4, 5], 2);\nconsole.log(await Array.fromAsync(iter)); // [1, 2]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { take } from \"@core/iterutil/pipe/take\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  take(2),\n);\nconsole.log(Array.from(iter)); // [1, 2]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { take } from \"@core/iterutil/pipe/async/take\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  take(2),\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 2]\n```\n\n### takeWhile\n\nTakes elements from the iterable while the predicate is true.\n\n```ts\nimport { takeWhile } from \"@core/iterutil/take-while\";\n\nconst iter = takeWhile(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v \u003c 4,\n);\nconsole.log(Array.from(iter)); // [1, 2, 3]\n```\n\n```ts\nimport { takeWhile } from \"@core/iterutil/async/take-while\";\n\nconst iter = takeWhile(\n  [1, 2, 3, 4, 5],\n  (v) =\u003e v \u003c 4,\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { takeWhile } from \"@core/iterutil/pipe/take-while\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  takeWhile((v) =\u003e v \u003c 4),\n);\nconsole.log(Array.from(iter)); // [1, 2, 3]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { takeWhile } from \"@core/iterutil/pipe/async/take-while\";\n\nconst iter = pipe(\n  [1, 2, 3, 4, 5],\n  takeWhile((v) =\u003e v \u003c 4),\n);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3]\n```\n\n### toAsyncIterable\n\nConverts an iterable to an async iterable.\n\n```ts\nimport { toAsyncIterable } from \"@core/iterutil/async/to-async-iterable\";\n\nconst iter = toAsyncIterable([1, 2, 3]);\nconsole.log(await Array.fromAsync(iter)); // [1, 2, 3]\n```\n\n### uniq\n\nReturns an iterable that yields the unique elements of the input iterable.\n\n```ts\nimport { uniq } from \"@core/iterutil/uniq\";\n\nconst iter1 = uniq([1, 2, 2, 3, 3, 3]);\nconsole.log(Array.from(iter1)); // [1, 2, 3]\n\nconst iter2 = uniq(\n  [1, 2, 3, 4, 5, 6, 7, 8, 9],\n  (v) =\u003e v % 4,\n);\nconsole.log(Array.from(iter2)); // [1, 2, 3, 4]\n```\n\n```ts\nimport { uniq } from \"@core/iterutil/async/uniq\";\n\nconst iter1 = uniq([1, 2, 2, 3, 3, 3]);\nconsole.log(await Array.fromAsync(iter1)); // [1, 2, 3]\n\nconst iter2 = uniq(\n  [1, 2, 3, 4, 5, 6, 7, 8, 9],\n  (v) =\u003e v % 4,\n);\nconsole.log(await Array.fromAsync(iter2)); // [1, 2, 3, 4]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { uniq } from \"@core/iterutil/pipe/uniq\";\n\nconst iter1 = pipe(\n  [1, 2, 2, 3, 3, 3],\n  uniq(),\n);\nconsole.log(Array.from(iter1)); // [1, 2, 3]\n\nconst iter2 = pipe(\n  [1, 2, 3, 4, 5, 6, 7, 8, 9],\n  uniq((v) =\u003e v % 4),\n);\nconsole.log(Array.from(iter2)); // [1, 2, 3, 4]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { uniq } from \"@core/iterutil/pipe/async/uniq\";\n\nconst iter1 = pipe(\n  [1, 2, 2, 3, 3, 3],\n  uniq(),\n);\nconsole.log(await Array.fromAsync(iter1)); // [1, 2, 3]\n\nconst iter2 = pipe(\n  [1, 2, 3, 4, 5, 6, 7, 8, 9],\n  uniq((v) =\u003e v % 4),\n);\nconsole.log(await Array.fromAsync(iter2)); // [1, 2, 3, 4]\n```\n\n### zip\n\nZips multiple iterables into a single iterable.\n\n```ts\nimport { zip } from \"@core/iterutil/zip\";\n\nconst iter = zip([1, 2, 3], [\"a\", \"b\", \"c\"]);\nconsole.log(Array.from(iter)); // [[1, \"a\"], [2, \"b\"], [3, \"c\"]]\n```\n\n```ts\nimport { zip } from \"@core/iterutil/async/zip\";\n\nconst iter = zip([1, 2, 3], [\"a\", \"b\", \"c\"]);\nconsole.log(await Array.fromAsync(iter)); // [[1, \"a\"], [2, \"b\"], [3, \"c\"]]\n```\n\nUse `pipe` and `pipe/async` modules for [@core/pipe] package like.\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { zip } from \"@core/iterutil/pipe/zip\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  zip([\"a\", \"b\", \"c\"]),\n);\nconsole.log(Array.from(iter)); // [[1, \"a\"], [2, \"b\"], [3, \"c\"]]\n```\n\n```ts\nimport { pipe } from \"@core/pipe\";\nimport { zip } from \"@core/iterutil/pipe/async/zip\";\n\nconst iter = pipe(\n  [1, 2, 3],\n  zip([\"a\", \"b\", \"c\"]),\n);\nconsole.log(await Array.fromAsync(iter)); // [[1, \"a\"], [2, \"b\"], [3, \"c\"]]\n```\n\n## License\n\nThe code follows MIT license written in [LICENSE](./LICENSE). Contributors need\nto agree that any modifications sent in this repository follow the license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsr-core%2Fiterutil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjsr-core%2Fiterutil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsr-core%2Fiterutil/lists"}