{"id":13727244,"url":"https://github.com/labs42io/itiriri-async","last_synced_at":"2025-05-07T20:45:33.913Z","repository":{"id":57278520,"uuid":"143964905","full_name":"labs42io/itiriri-async","owner":"labs42io","description":"A library for asynchronous iteration.","archived":false,"fork":false,"pushed_at":"2019-05-17T07:14:51.000Z","size":108,"stargazers_count":80,"open_issues_count":2,"forks_count":2,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-05-07T20:45:30.471Z","etag":null,"topics":["async-await","async-iterable","async-iterator","filter","for-await-of","map","slice"],"latest_commit_sha":null,"homepage":"https://labs42io.github.io/itiriri-async","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/labs42io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-08-08T05:25:39.000Z","updated_at":"2025-01-12T09:01:17.000Z","dependencies_parsed_at":"2022-09-18T12:42:39.589Z","dependency_job_id":null,"html_url":"https://github.com/labs42io/itiriri-async","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/labs42io%2Fitiriri-async","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/labs42io%2Fitiriri-async/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/labs42io%2Fitiriri-async/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/labs42io%2Fitiriri-async/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/labs42io","download_url":"https://codeload.github.com/labs42io/itiriri-async/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252954145,"owners_count":21830895,"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":["async-await","async-iterable","async-iterator","filter","for-await-of","map","slice"],"created_at":"2024-08-03T01:03:45.758Z","updated_at":"2025-05-07T20:45:33.888Z","avatar_url":"https://github.com/labs42io.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# itiriri-async\n\n[![Build Status](https://travis-ci.org/labs42io/itiriri-async.svg)](https://travis-ci.org/labs42io/itiriri-async)\n[![Coverage Status](https://coveralls.io/repos/github/labs42io/itiriri-async/badge.svg)](https://coveralls.io/github/labs42io/itiriri-async)\n\nNext generation library to manipulate [asynchronous iterators](https://github.com/tc39/proposal-async-iteration).\n\n```ts\nimport * as WebRequest from 'web-request';\nimport itiririAsync from 'itiriri-async';\n\ntype ToDo = {\n  id: number,\n  userId: number,\n  title: string,\n  completed: boolean,\n};\n\nasync function* todosAsync() {\n  let id = 1;\n  while (true) {\n    yield await WebRequest.json\u003cToDo\u003e(`https://jsonplaceholder.typicode.com/todos/${id++}`);\n  }\n}\n\nasync function showTop2ToDos(): Promise\u003cvoid\u003e {\n  const todos = await itiririAsync(todosAsync())\n    .filter(x =\u003e !x.completed)\n    .take(2)\n    .awaitAll();\n\n  console.log(todos.toArray());\n}\n\nshowTop2ToDos();\n// [ 'delectus aut autem', 'quis ut nam facilis et officia qui' ]\n```\n\n\u003e Check examples folder for more\n\n## Installation\n\nUsing npm:\n\n```javascript\n$ npm install 'itiriri-async' --save\n```\n\nImporting:\n\n```javascript\nimport itiririAsync from 'itiriri-async';\n```\n\n## Running tests\n\n```javascript\n$ npm install\n$ npm test\n```\n\n---\n\n## Complete list of methods\n\n* [average](#average)\n* [awaitAll](#awaitall)\n* [concat](#concat)\n* [distinct](#distinct)\n* [entries](#entries)\n* [every](#every)\n* [exclude](#exclude)\n* [filter](#filter)\n* [find](#find)\n* [findIndex](#findindex)\n* [findLast](#findlast)\n* [findLastIndex](#findlastindex)\n* [first](#first)\n* [flat](#flat)\n* [forEach](#foreach)\n* [groupJoin](#groupjoin)\n* [includes](#includes)\n* [indexOf](#indexof)\n* [intersect](#intersect)\n* [join](#join)\n* [keys](#keys)\n* [last](#last)\n* [lastIndexOf](#lastindexof)\n* [leftJoin](#leftjoin)\n* [length](#length)\n* [map](#map)\n* [max](#max)\n* [min](#min)\n* [nth](#nth)\n* [prepend](#prepend)\n* [reduce](#reduce)\n* [skip](#skip)\n* [slice](#slice)\n* [some](#some)\n* [sum](#sum)\n* [take](#take)\n* [union](#union)\n* [values](#values)\n\n### `average`\n\nReturns the average value.\n\n\u003e Syntax\n\n```ts\naverage(): Promise\u003cnumber\u003e;\naverage(selector: (element: T, index: number) =\u003e number): Promise\u003cnumber\u003e;\n```\n\n\u003e Parameters\n* `selector` - *(optional)* a value transformer function to apply to each element\n\nFor a sequence with no elements returns `undefined`.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator1() {\n  yield* [41, 42, 43];\n}\n\nasync function* generator2() {\n  yield* [{value: 1}, {value: 2}];\n}\n\nitiririAsync(generator1()).average()  // returns Promise\u003c42\u003e\nitiririAsync(generator2()).average(elem =\u003e elem.value) // returns Promise\u003c1.5\u003e\n```\n\n### `awaitAll`\n\nAwaits for all elements an returns `IterableQuery`.\nThe ruterned iterable is a sync [`itiriri`](https://npmjs.com/package/itiriri) iterable.\n\n\u003e Syntax\n\n```ts\nawaitAll(): Promise\u003cIterableQuery\u003cT\u003e\u003e\n```\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [41, 40, 43];\n}\n\n// ...\nconst numbers = await itiririAsync(generator()).awaitAll();\n// returns IterableQuery([41, 40, 43])\n\nnumbers.sort().toArray();\n// returns: [40, 41, 43]\n```\n\n### `concat`\n\nConcatenates the sequence with another one.\n\n\u003e Syntax\n\n```ts\nconcat(other: T): AsyncIterableQuery\u003cT\u003e;\nconcat(other: Promise\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\nconcat(other: Iterable\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\nconcat(other: AsyncIterable\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `other` - *(required)* sequence to concatenate\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator1() {\n  yield* [1, 2, 3];\n}\n\nasync function* generator2() {\n  yield* [4, 5];\n}\n\n(async function() {\n  const q = await itiririAsync(generator1()).concat(generator2()).awaitAll();\n  q.toArray();   // returns [1, 2, 3, 4, 5]\n})();\n\n(async function() {\n  const q = await itiririAsync(generator1()).concat([2, 1]).awaitAll();\n  q.toArray();   // returns [1, 2, 3, 2, 1]\n})();\n\n(async function() {\n  const q = await itiririAsync(generator1()).concat(-1).awaitAll();\n  q.toArray();   // returns [1, 2, 3, -1]\n})();\n```\n\n`concat` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `distinct`\n\nReturns a sequence of unique elements.\n\n\u003e Syntax\n\n```ts\ndistinct(): AsyncIterableQuery\u003cT\u003e;\ndistinct\u003cS\u003e(selector: (element: T) =\u003e S): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `selector` - *(optional)* a value transformer function to be used for comparisons\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, 3, 3, 4, 2];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).distinct().awaitAll();\n  q.toArray();   // returns [1, 2, 3, 4]\n})();\n```\n\n`distinct` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `entries`\n\nReturns a sequence of key/value pair for each element and its index.\n\n\u003e Syntax\n\n```ts\nentries(): AsyncIterableQuery\u003c[number, T]\u003e;\n```\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* ['Bob', 'Alice'];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).entries().awaitAll();\n  q.toArray();   // returns [[0, 'Bob'], [1, 'Alice']]\n})();\n```\n\n`entries` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `every`\n\nTests whether all the elements pass the predicate.\n\n\u003e Syntax\n\n```ts\nevery(predicate: (element: T, index: number) =\u003e boolean): Promise\u003cboolean\u003e;\n```\n\n\u003e Parameters\n* `predicate` - *(required)* function to test for each element\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 4, 3, 0];\n}\n\n(async function () {\n  await itiririAsync(generator()).every(x =\u003e x \u003e= 0); // true\n})();\n\n(async function () {\n  await itiririAsync(generator()).every(x =\u003e x \u003e 0); // false\n})();\n```\n\n### `exclude`\n\nReturns a sequence of elements not contained in a given sequence.\n\n\u003e Syntax\n\n```ts\nexclude\u003cS\u003e(others: Iterable\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\nexclude\u003cS\u003e(others: Iterable\u003cT\u003e, selector: (element: T) =\u003e S): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `others` - *(required)* a sequence of elements to be excluded\n* `selector` - *(optional)* a value transformer function to be used for comparisons\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator1() {\n  yield* [2, 0, 1, 8, 2];\n}\n\nasync function* generator2() {\n  yield* [{ id: 1 }, { id: 2 }];\n}\n\n(async function () {\n  const q = await itiririAsync(generator1()).exclude([0, 1]).awaitAll();\n  q.toArray(); // returns [2, 8, 2]\n})();\n\n(async function () {\n  const q = await itiririAsync(generator2()).exclude([{ id: 2 }], x =\u003e x.id).awaitAll();\n  q.toArray(); // returns [{id: 1}]\n})();\n```\n\n`exclude` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `filter`\n\nReturns a sequence of elements that pass the predicate.\n\n\u003e Syntax\n\n```ts\nfilter(predicate: (element: T, index: number) =\u003e boolean): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `predicate` - *(required)* function to test for each element\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, 4, 5];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).filter(elem =\u003e elem \u003c 3).awaitAll();\n  q.toArray(); // returns [1, 2]\n})();\n\n(async function () {\n  const q = await itiririAsync(generator()).filter(elem =\u003e elem \u003e 10).awaitAll();\n  q.toArray(); // returns []\n})();\n```\n\n`filter` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `find`\n\nFinds the first element that satisfies the specified predicate.\n\n\u003e Syntax\n\n```ts\nfind(predicate: (element: T, index: number) =\u003e boolean): Promise\u003cT\u003e;\n```\n\n\u003e Parameters\n* `predicate` - *(required)* function to test for each element\n\nIf no element satisfies the predicate, returns `undefined`.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, 4, 5];\n}\n\n(async function () {\n  await itiririAsync(generator()).find(elem =\u003e elem \u003e 2); // returns 3\n})();\n\n(async function () {\n  await itiririAsync(generator()).find(elem =\u003e elem \u003e 10); // returns undefined\n})();\n```\n\n### `findIndex`\n\nFinds the first index at which a given element satisfies the specified predicate.\n\n\u003e Syntax\n\n```ts\nfindIndex(predicate: (element: T, index: number) =\u003e boolean): Promise\u003cnumber\u003e;\n```\n\n\u003e Parameters\n* `predicate` - *(required)* function to test for each element\n\nIf no element satisfies the predicate, returns `-1`.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, 4, 5];\n}\n\n(async function () {\n  await itiririAsync(generator()).find(elem =\u003e elem \u003e 2); // returns 2\n})();\n\n(async function () {\n  await itiririAsync(generator()).find(elem =\u003e elem \u003e 10); // returns -1\n})();\n```\n\n### `findLast`\n\nFinds the last element that satisfies the specified predicate.\n\n\u003e Syntax\n\n```ts\nfindLast(predicate: (element: T, index: number) =\u003e boolean): Promise\u003cT\u003e;\n```\n\n\u003e Parameters\n* `predicate` - *(required)* function to test for each element\n\nIf no element satisfies the predicate, returns `undefined`.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, 4, 5];\n}\n\n(async function () {\n  await itiririAsync(generator()).findLast(elem =\u003e elem \u003e 2); // returns 5\n})();\n\n(async function () {\n  await itiririAsync(generator()).findLast(elem =\u003e elem \u003e 10); // returns undefined\n})();\n```\n\n### `findLastIndex`\n\nFinds the last index at which a given element satisfies the specified predicate.\n\n\u003e Syntax\n\n```ts\nfindLastIndex(predicate: (element: T, index: number) =\u003e boolean): Promise\u003cnumber\u003e;\n```\n\n\u003e Parameters\n* `predicate` - *(required)* function to test for each element\n\nIf not present, returns `-1`.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, 4, 5];\n}\n\n(async function () {\n  await itiririAsync(generator()).findLastIndex(elem =\u003e elem \u003e 2); // returns 4\n})();\n\n(async function () {\n  await itiririAsync(generator()).findLastIndex(elem =\u003e elem \u003e 10); // returns -1\n})();\n```\n\n### `first`\n\nReturns the first element in a sequence.\n\n\u003e Syntax\n\n```ts\nfirst(): Promise\u003cT\u003e;\n```\n\nFor an empty sequence returns `undefined`.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator1() {\n  yield* [1, 2, 3, 4, 5];\n}\n\nasync function* generator2() {\n  yield* [];\n}\n\n(async function () {\n  await itiririAsync(generator1()).first(); // returns 1\n})();\n\n(async function () {\n  await itiririAsync(generator2()).first(); // returns undefined\n})();\n```\n\n### `flat`\n\nReturns a sequence with all sub-sequences concatenated.\n\n\u003e Syntax\n\n```ts\nflat\u003cT\u003e(selector?: (element: T, index: number) =\u003e AsyncIterable\u003cS\u003e): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `selector` - *(optional)* a value transformer function to be used for comparisons\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [[1, 2, 3], [4, 5]];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).flat().awaitAll();\n  q.toArray(); // returns [1, 2, 3, 4, 5]\n})();\n```\n\n`flat` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `forEach`\n\nRuns through every element and applies a given function.\n\n\u003e Syntax\n\n```ts\nforEach(action: (element: T, index: number) =\u003e void): Promise\u003cvoid\u003e;\n```\n\n\u003e Parameters\n* `action` - *(required)* function to apply on each element\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  await itiririAsync(generator()).forEach(elem =\u003e console.log(elem));\n})();\n// 1\n// 2\n// 3\n```\n\n### `groupJoin`\n\nReturns a sequence of correlated elements where each element from the current sequence\nis matched with zero or more elements from the other sequence.\n\n\u003e Syntax\n\n```ts\ngroupJoin\u003cTKey, TRight, TResult\u003e(\n    other: Iterable\u003cTRight\u003e,\n    leftKeySelector: (element: T, index: number) =\u003e TKey,\n    rightKeySelector: (element: TRight, index: number) =\u003e TKey,\n    joinSelector: (left: T, right: TRight[]) =\u003e TResult,\n  ): AsyncIterableQuery\u003cTResult\u003e;\n```\n\n\u003e Parameters\n* `other` - *(required)* sequence to join\n* `leftKeySelector` - *(required)* function that provides the key of each element from source sequence\n* `rightKeySelector` - *(required)* function that provides the key of each element from joined sequence\n* `joinSelector` - *(required)* a transformation function to apply on each joined element with group\n\nThe `joinSelector` function is called on each element from the source sequence and the array of matched\nelements from the joined sequence.  \nWhen an element from the source sequence doesn't match with any of the elements from the joined sequence,\nthe `joinSelector` function will be called with an empty array.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  const q = await itiririAsync(generator())\n    .groupJoin([1, 2, 3, 1, 1, 2], x =\u003e x, x =\u003e x, (x, y) =\u003e ({ x, y }))\n    .awaitAll();\n  q.toArray();\n})();\n//[ { x: 1, y: [ 1, 1, 1 ] },\n//  { x: 2, y: [ 2, 2 ] },\n//  { x: 3, y: [ 3 ] } ]\n```\n\n`groupJoin` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `includes`\n\nDetermines whether the sequence includes a certain element.\n\n\u003e Syntax\n\n```ts\nincludes(element: T): Promise\u003cboolean\u003e;\nincludes(element: T, fromIndex: number): Promise\u003cboolean\u003e;\n```\n\n\u003e Parameters\n* `element` - *(required)* the element to search for\n* `fromIndex` - *(optional)* starting index, defaults to `0`\n\n`includes` uses triple equals `===` to compare elements.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  await itiririAsync(generator()).includes(2); // returns: true\n  await itiririAsync(generator()).includes(4); // returns: false\n})();\n```\n\n### `indexOf`\n\nReturns the first (zero-based) index at which a given element can be found.\n\n\u003e Syntax\n\n```ts\nindexOf(element: T): Promise\u003cnumber\u003e;\nindexOf(element: T, fromIndex: number): Promise\u003cnumber\u003e;\n```\n\n\u003e Parameters\n* `element` - *(required)* the element to search for\n* `fromIndex` - *(optional)* starting index, defaults to `0`\n\nWhen an element is not found, returns -1.  \n`indexOf` uses triple equals `===` to compare elements.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  await itiririAsync(generator()).indexOf(2); // returns: 1\n  await itiririAsync(generator()).indexOf(4); // returns: -1\n})();\n```\n\n### `intersect`\n\nReturns a set intersection with a given sequence.\n\n\u003e Syntax\n\n```ts\nintersect(others: Iterable\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\nintersect\u003cS\u003e(other: Iterable\u003cT\u003e, selector: (element: T) =\u003e S): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `other` - *(required)* the sequence to intersect with\n* `selector` - *(optional)* a value transformer function to be used for comparisons\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  const q = await itiririAsync(generator())\n    .intersect([1, 2, 4])\n    .awaitAll();\n  q.toArray(); // returns: [1, 2]\n})();\n```\n\n`intersect` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `join`\n\nReturns a sequence of correlated elements transformation that match a given key.\n\n\u003e Syntax\n\n```ts\njoin\u003cTKey, TRight, TResult\u003e(\n    other: Iterable\u003cTRight\u003e,\n    leftKeySelector: (element: T, index: number) =\u003e TKey,\n    rightKeySelector: (element: TRight, index: number) =\u003e TKey,\n    joinSelector: (left: T, right: TRight) =\u003e TResult,\n  ): AsyncIterableQuery\u003cTResult\u003e;\n```\n\n\u003e Parameters\n* `other` - *(required)* sequence to join\n* `leftKeySelector` - *(required)* function that provides the key of each element from source sequence\n* `rightKeySelector` - *(required)* function that provides the key of each element from joined sequence\n* `joinSelector` - *(required)* a transformation function to apply on each matched tuple\n\nThe `join` method works as an sql inner join.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  const q = await itiririAsync(generator())\n    .join([1, 1, 2], x =\u003e x, x =\u003e x, (x, y) =\u003e ({ x, y }))\n    .awaitAll();\n  q.toArray(); // returns: [ { x: 1, y: 1 }, { x: 1, y: 1 }, { x: 2, y: 2 } ]\n})();\n```\n\n`join` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `keys`\n\nReturns a sequence of keys for each index in the source sequence.\n\n\u003e Syntax\n\n```ts\nkeys(): AsyncIterableQuery\u003cnumber\u003e;\n```\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* ['a', 'b', 'c'];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).keys().awaitAll();\n  q.toArray(); // returns: [0, 1, 2]\n})();\n```\n\n`keys` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `last`\n\nReturns the last element in a sequence.\n\n\u003e Syntax\n\n```ts\nlast(): Promise\u003cT\u003e;\n```\n\nFor an empty sequence returns `undefined`.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, -2];\n}\n\n(async function () {\n  await itiririAsync(generator()).last(); // returns: -2\n})();\n```\n\n### `lastIndexOf`\n\nReturns the last index at which a given element can be found.\n\n\u003e Syntax\n\n```ts\nlastIndexOf(element: T): Promise\u003cnumber\u003e;\nlastIndexOf(element: T, fromIndex: number): Promise\u003cnumber\u003e;\n```\n\n\u003e Parameters\n* `element` - *(required)* the element to search for\n* `fromIndex` - *(optional)* starting index, defaults to `0`\n\nWhen an element is not found, returns -1.  \n`lastIndexOf` uses triple equals `===` to compare elements.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, 2, 1];\n}\n\n(async function () {\n  await itiririAsync(generator()).lastIndexOf(2); // returns: 3\n})();\n```\n\n### `leftJoin`\n\nReturns a sequence of correlated elements transformation that match a given key.\n\n\u003e Syntax\n\n```ts\nleftJoin\u003cTKey, TRight, TResult\u003e(\n    other: Iterable\u003cTRight\u003e,\n    leftKeySelector: (element: T, index: number) =\u003e TKey,\n    rightKeySelector: (element: TRight, index: number) =\u003e TKey,\n    joinSelector: (left: T, right?: TRight) =\u003e TResult,\n  ): AsyncIterableQuery\u003cTResult\u003e;\n```\n\n\u003e Parameters\n* `other` - *(required)* sequence to join\n* `leftKeySelector` - *(required)* function that provides the key of each element from source sequence\n* `rightKeySelector` - *(required)* function that provides the key of each element from joined sequence\n* `joinSelector` - *(required)* a transformation function to apply on each matched tuple\n\nThe `leftJoin` method works as an sql left join.\nWhen an element from the left sequence doesn't match with any of the elements from the right sequence,\nthe `joinSelector` function is called with an `undefined` right value.  \n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  const q = await itiririAsync(generator())\n    .leftJoin([2, 3, 4, 2], n =\u003e n, n =\u003e n, (a, b) =\u003e `${a}-${b || '#'}`)\n    .awaitAll();\n  q.toArray(); // returns ['1-#', '2-2', '2-2', '3-3']\n})();\n```\n\n`leftJoin` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `length`\n\nReturns the number of elements in a sequence.\n\n\u003e Syntax\n\n```ts\nlength(): Promise\u003cnumber\u003e;\nlength(predicate: (element: T, index: number) =\u003e boolean): Promise\u003cnumber\u003e;\n```\n\n\u003e Parameters\n* `predicate` - *(optional)* a function to count only the elements that match the predicate\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  await itiririAsync(generator()).length(); // returns 3\n})();\n```\n\n### `map`\n\nReturns a sequence of transformed values.\n\n\u003e Syntax\n\n```ts\nmap\u003cS\u003e(selector: (element: T, index: number) =\u003e S): AsyncIterableQuery\u003cS\u003e;\n```\n\n\u003e Parameters\n* `selector` - *(required)* a value transformer function to apply to each element\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\nfunction x10(numbers: AsyncIterable\u003cnumber\u003e) {\n  return itiririAsync(numbers).map(n =\u003e n * 10);\n}\n\n(async function(){\n  const numbers = await x10(generator()).awaitAll();\n  console.log(numbers); // [10, 20, 30]\n})();\n```\n\n`map` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `max`\n\nReturns the maximum element in a sequence.\n\n\u003e Syntax\n\n```ts\nmax(): Promise\u003cT\u003e;\nmax(compareFn: (a: T, b: T) =\u003e number): Promise\u003cT\u003e;\n```\n\n\u003e Parameters\n* `compareFn` - *(optional)* a comparer function that compares two elements from a sequence and returns:\n  * `-1` when `a` is less than `b`\n  * `1` when `a` is greater `b`\n  * `0` when `a` equals to `b`\n\nIf sequence is empty, returns `undefined`.  \n\n\u003e Example\n\n```ts\nasync function* generator1() {\n  yield* [1, 42, 3];\n}\n\nasync function* generator2() {\n  yield* [];\n}\n\n\n(async function () {\n  await itiririAsync(generator1()).max(); // returns 42\n  await itiririAsync(generator2()).max(); // returns undefined\n})();\n```\n\n### `min`\n\nReturns the minimum element in a sequence.\n\n\u003e Syntax\n\n```ts\nmin(): Promise\u003cT\u003e;\nmin(compareFn: (a: T, b: T) =\u003e number): Promise\u003cT\u003e;\n```\n\n\u003e Parameters\n* `compareFn` - *(optional)* a comparer function that compares two elements from a sequence and returns:\n  * `-1` when `a` is less than `b`\n  * `1` when `a` is greater `b`\n  * `0` when `a` equals to `b`\n\nIf sequence is empty, returns `undefined`.  \n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator1() {\n  yield* [1, -2, 3];\n}\n\nasync function* generator2() {\n  yield* [];\n}\n\n(async function () {\n  await itiririAsync(generator1()).min(); // returns -1\n  await itiririAsync(generator2()).min(); // returns undefined\n})();\n```\n\n### `nth`\n\nReturns the element at a specified index.\n\n\u003e Syntax\n\n```ts\nnth(index: number): Promise\u003cT\u003e;\n```\n\n\u003e Parameters\n* `index` - *(required)* zero based index at which to get the element\n\nIf index is out of the range, returns `undefined` .\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, -2, 3];\n}\n\n(async function () {\n  await itiririAsync(generator()).nth(2); // returns: 3\n  await itiririAsync(generator()).nth(3); // returns: undefined\n})();\n```\n\n### `prepend`\n\n Returns a sequence with given elements at the beginning.\n\n\u003e Syntax\n\n```ts\nprepend(other: T): AsyncIterableQuery\u003cT\u003e;\nprepend(other: Promise\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\nprepend(other: Iterable\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\nprepend(other: AsyncIterable\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `other` - *(required)* the sequence to be added at the beginning\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, -2, 3];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).prepend(4).awaitAll();\n  q.toArray(); // returns: [4, 1, -2, 3]\n})();\n\n(async function () {\n  const q = await itiririAsync(generator()).prepend([0, 4]).awaitAll();\n  q.toArray(); // returns: [0, 4, 1, -2, 3]\n})();\n```\n\n`prepend` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `reduce`\n\nApplies a function against an accumulator and each element *(from left to right)* to reduce it to a single value.\n\n\u003e Syntax\n\n```ts\nreduce(\n    callback: (accumulator: T, current: T, index: number) =\u003e T,\n  ): Promise\u003cT\u003e;\n\nreduce\u003cS\u003e(\n    callback: (accumulator: S, current: T, index: number) =\u003e S,\n    initialValue: S,\n  ): Promise\u003cS\u003e;\n```\n\n\u003e Parameters\n* `callback` - *(required)* function to execute on each element in the sequence, taking three arguments\n  * `accumulator` the accumulator accumulates the callback's return values;\n  * `current` the current element being processed;\n  * `currentIndex` the index of the current element being processed;\n* `initialValue` - *(optional)* value to use as the first argument to the first call of the `callback`\n\nCalling `reduce` on an empty sequence without an initial value throws an error.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  // 5 + 10 + 20 + 30\n  await itiririAsync(generator()).reduce((accum, elem) =\u003e accum + elem * 10, 5); // returns 65\n})();\n```\n\n### `skip`\n\nSkips the specified number of elements from the beginning of sequence and returns the remaining ones.\n\n\u003e Syntax\n\n```ts\nskip(count: number): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `count` - *(required)* number of elements to skip\n\nWhen *count* is greater than actual number of elements, results in an empty sequence.  \n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).skip(1).awaitAll();\n  q.toArray(); // returns: [2, 3]\n})();\n\n(async function () {\n  const q = await itiririAsync(generator()).skip(10).awaitAll();\n  q.toArray(); // returns: []\n})();\n```\n\n`skip` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `slice`\n\nReturns a sequence that represents the range of elements from start to end.\n\n\u003e Syntax\n\n```ts\nslice(start: number, end: number): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `start` - *(required)* zero-based index at which to begin extraction\n* `end` - *(required)* zero-based index before which to end extraction.\n\nThe `end` index is not included in the result.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, 3, 4];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).slice(2, 4).awaitAll();\n  q.toArray(); // returns: [3, 3]\n})();\n```\n\n`slice` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `some`\n\nTests whether at least one element passes the predicate.\n\n\u003e Syntax\n\n```ts\nsome(predicate: (element: T, index: number) =\u003e boolean): Promise\u003cboolean\u003e;\n```\n\n\u003e Parameters\n* `predicate` - *(required)* function to test for each element\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3, -3, 4, 0];\n}\n\n(async function () {\n  await itiririAsync(generator()).some(x =\u003e x \u003c 0); // returns: true\n  await itiririAsync(generator()).some(x =\u003e x \u003e 5); // returns: false\n})();\n```\n\n### `sum`\n\nReturns the sum of all elements.\n\n\u003e Syntax\n\n```ts\nsum(): number;\nsum(selector: (element: T, index: number) =\u003e number): Promise\u003cnumber\u003e;\n```\n\n\u003e Parameters\n* `selector` - *(optional)* a value transformer function to apply to each element\n\nOptionally, a function can be provided to apply a transformation and map each element to a value.\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator1() {\n  yield* [1, 2, 3];\n}\n\nasync function* generator2() {\n  yield* [{ val: 3 }, { val: 5 }];\n}\n\n(async function () {\n  await itiririAsync(generator1()).sum(); // returns: 6\n  await itiririAsync(generator2()).sum(x =\u003e x.val); // returns: 8\n})();\n```\n\n### `take`\n\nReturns a specified number of elements from the beginning of sequence.\n\n\u003e Syntax\n\n```ts\ntake(count: number): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `count` - *(required)* number of elements to take\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 2, 3];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).take(2).awaitAll();\n  q.toArray(); // returns: [1, 2]\n})();\n\n(async function () {\n  const q = await itiririAsync(generator()).take(0).awaitAll();\n  q.toArray(); // returns: []\n})();\n```\n\n`take` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `union`\n\nReturns a set union with a given sequence.\n\n\u003e Syntax\n\n```ts\nunion(other: AsyncIterable\u003cT\u003e): AsyncIterableQuery\u003cT\u003e;\nunion\u003cS\u003e(other: AsyncIterable\u003cT\u003e, selector: (element: T) =\u003e S): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Parameters\n* `other` - *(required)* the sequence to join with\n* `selector` - *(optional)* a value transformer function to be used for comparisons\n\nExample\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator1() {\n  yield* [1, 2, 3];\n}\n\nasync function* generator2() {\n  yield* [3, 4, 5];\n}\n\n(async function () {\n  const q = await itiririAsync(generator1()).union(generator2()).awaitAll();\n  q.toArray(); // returns [1, 2, 3, 4, 5]\n})();\n```\n\n`union` *is a deferred method and is executed only when the result sequence is iterated.*\n\n### `values`\n\nReturns a sequence of values for each index in the source sequence.\n\n\u003e Syntax\n\n```ts\nvalues(): AsyncIterableQuery\u003cT\u003e;\n```\n\n\u003e Example\n\n```ts\nimport itiririAsync from 'itiriri-async';\n\nasync function* generator() {\n  yield* [1, 0, 2, 3];\n}\n\n(async function () {\n  const q = await itiririAsync(generator()).values().awaitAll();\n  q.toArray(); // [1, 0, 2, 3]\n})();\n```\n\n`values` *is a deferred method and is executed only when the result sequence is iterated.*\n\n## License\n\n[MIT](LICENSE)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flabs42io%2Fitiriri-async","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flabs42io%2Fitiriri-async","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flabs42io%2Fitiriri-async/lists"}