Next generation library to manipulate asynchronous iterators.
import * as WebRequest from 'web-request';
import itiririAsync from 'itiriri-async';
type ToDo = {
id: number,
userId: number,
title: string,
completed: boolean,
};
async function* todosAsync() {
let id = 1;
while (true) {
yield await WebRequest.json<ToDo>(`https://jsonplaceholder.typicode.com/todos/${id++}`);
}
}
async function showTop2ToDos(): Promise<void> {
const todos = await itiririAsync(todosAsync())
.filter(x => !x.completed)
.take(2)
.awaitAll();
console.log(todos.toArray());
}
showTop2ToDos();
// [ 'delectus aut autem', 'quis ut nam facilis et officia qui' ]
Check examples folder for more
Using npm:
$ npm install 'itiriri-async' --save
Importing:
import itiririAsync from 'itiriri-async';
$ npm install
$ npm test
- average
- awaitAll
- concat
- distinct
- entries
- every
- exclude
- filter
- find
- findIndex
- findLast
- findLastIndex
- first
- flat
- forEach
- groupJoin
- includes
- indexOf
- intersect
- join
- keys
- last
- lastIndexOf
- leftJoin
- length
- map
- max
- min
- nth
- prepend
- reduce
- skip
- slice
- some
- sum
- take
- union
- values
Returns the average value.
Syntax
average(): Promise<number>;
average(selector: (element: T, index: number) => number): Promise<number>;
Parameters
selector
- (optional) a value transformer function to apply to each element
For a sequence with no elements returns undefined
.
Example
import itiririAsync from 'itiriri-async';
async function* generator1() {
yield* [41, 42, 43];
}
async function* generator2() {
yield* [{value: 1}, {value: 2}];
}
itiririAsync(generator1()).average() // returns Promise<42>
itiririAsync(generator2()).average(elem => elem.value) // returns Promise<1.5>
Awaits for all elements an returns IterableQuery
.
The ruterned iterable is a sync itiriri
iterable.
Syntax
awaitAll(): Promise<IterableQuery<T>>
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [41, 40, 43];
}
// ...
const numbers = await itiririAsync(generator()).awaitAll();
// returns IterableQuery([41, 40, 43])
numbers.sort().toArray();
// returns: [40, 41, 43]
Concatenates the sequence with another one.
Syntax
concat(other: T): AsyncIterableQuery<T>;
concat(other: Promise<T>): AsyncIterableQuery<T>;
concat(other: Iterable<T>): AsyncIterableQuery<T>;
concat(other: AsyncIterable<T>): AsyncIterableQuery<T>;
Parameters
other
- (required) sequence to concatenate
Example
import itiririAsync from 'itiriri-async';
async function* generator1() {
yield* [1, 2, 3];
}
async function* generator2() {
yield* [4, 5];
}
(async function() {
const q = await itiririAsync(generator1()).concat(generator2()).awaitAll();
q.toArray(); // returns [1, 2, 3, 4, 5]
})();
(async function() {
const q = await itiririAsync(generator1()).concat([2, 1]).awaitAll();
q.toArray(); // returns [1, 2, 3, 2, 1]
})();
(async function() {
const q = await itiririAsync(generator1()).concat(-1).awaitAll();
q.toArray(); // returns [1, 2, 3, -1]
})();
concat
is a deferred method and is executed only when the result sequence is iterated.
Returns a sequence of unique elements.
Syntax
distinct(): AsyncIterableQuery<T>;
distinct<S>(selector: (element: T) => S): AsyncIterableQuery<T>;
Parameters
selector
- (optional) a value transformer function to be used for comparisons
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, 3, 3, 4, 2];
}
(async function () {
const q = await itiririAsync(generator()).distinct().awaitAll();
q.toArray(); // returns [1, 2, 3, 4]
})();
distinct
is a deferred method and is executed only when the result sequence is iterated.
Returns a sequence of key/value pair for each element and its index.
Syntax
entries(): AsyncIterableQuery<[number, T]>;
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* ['Bob', 'Alice'];
}
(async function () {
const q = await itiririAsync(generator()).entries().awaitAll();
q.toArray(); // returns [[0, 'Bob'], [1, 'Alice']]
})();
entries
is a deferred method and is executed only when the result sequence is iterated.
Tests whether all the elements pass the predicate.
Syntax
every(predicate: (element: T, index: number) => boolean): Promise<boolean>;
Parameters
predicate
- (required) function to test for each element
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 4, 3, 0];
}
(async function () {
await itiririAsync(generator()).every(x => x >= 0); // true
})();
(async function () {
await itiririAsync(generator()).every(x => x > 0); // false
})();
Returns a sequence of elements not contained in a given sequence.
Syntax
exclude<S>(others: Iterable<T>): AsyncIterableQuery<T>;
exclude<S>(others: Iterable<T>, selector: (element: T) => S): AsyncIterableQuery<T>;
Parameters
others
- (required) a sequence of elements to be excludedselector
- (optional) a value transformer function to be used for comparisons
Example
import itiririAsync from 'itiriri-async';
async function* generator1() {
yield* [2, 0, 1, 8, 2];
}
async function* generator2() {
yield* [{ id: 1 }, { id: 2 }];
}
(async function () {
const q = await itiririAsync(generator1()).exclude([0, 1]).awaitAll();
q.toArray(); // returns [2, 8, 2]
})();
(async function () {
const q = await itiririAsync(generator2()).exclude([{ id: 2 }], x => x.id).awaitAll();
q.toArray(); // returns [{id: 1}]
})();
exclude
is a deferred method and is executed only when the result sequence is iterated.
Returns a sequence of elements that pass the predicate.
Syntax
filter(predicate: (element: T, index: number) => boolean): AsyncIterableQuery<T>;
Parameters
predicate
- (required) function to test for each element
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, 4, 5];
}
(async function () {
const q = await itiririAsync(generator()).filter(elem => elem < 3).awaitAll();
q.toArray(); // returns [1, 2]
})();
(async function () {
const q = await itiririAsync(generator()).filter(elem => elem > 10).awaitAll();
q.toArray(); // returns []
})();
filter
is a deferred method and is executed only when the result sequence is iterated.
Finds the first element that satisfies the specified predicate.
Syntax
find(predicate: (element: T, index: number) => boolean): Promise<T>;
Parameters
predicate
- (required) function to test for each element
If no element satisfies the predicate, returns undefined
.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, 4, 5];
}
(async function () {
await itiririAsync(generator()).find(elem => elem > 2); // returns 3
})();
(async function () {
await itiririAsync(generator()).find(elem => elem > 10); // returns undefined
})();
Finds the first index at which a given element satisfies the specified predicate.
Syntax
findIndex(predicate: (element: T, index: number) => boolean): Promise<number>;
Parameters
predicate
- (required) function to test for each element
If no element satisfies the predicate, returns -1
.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, 4, 5];
}
(async function () {
await itiririAsync(generator()).find(elem => elem > 2); // returns 2
})();
(async function () {
await itiririAsync(generator()).find(elem => elem > 10); // returns -1
})();
Finds the last element that satisfies the specified predicate.
Syntax
findLast(predicate: (element: T, index: number) => boolean): Promise<T>;
Parameters
predicate
- (required) function to test for each element
If no element satisfies the predicate, returns undefined
.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, 4, 5];
}
(async function () {
await itiririAsync(generator()).findLast(elem => elem > 2); // returns 5
})();
(async function () {
await itiririAsync(generator()).findLast(elem => elem > 10); // returns undefined
})();
Finds the last index at which a given element satisfies the specified predicate.
Syntax
findLastIndex(predicate: (element: T, index: number) => boolean): Promise<number>;
Parameters
predicate
- (required) function to test for each element
If not present, returns -1
.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, 4, 5];
}
(async function () {
await itiririAsync(generator()).findLastIndex(elem => elem > 2); // returns 4
})();
(async function () {
await itiririAsync(generator()).findLastIndex(elem => elem > 10); // returns -1
})();
Returns the first element in a sequence.
Syntax
first(): Promise<T>;
For an empty sequence returns undefined
.
Example
import itiririAsync from 'itiriri-async';
async function* generator1() {
yield* [1, 2, 3, 4, 5];
}
async function* generator2() {
yield* [];
}
(async function () {
await itiririAsync(generator1()).first(); // returns 1
})();
(async function () {
await itiririAsync(generator2()).first(); // returns undefined
})();
Returns a sequence with all sub-sequences concatenated.
Syntax
flat<T>(selector?: (element: T, index: number) => AsyncIterable<S>): AsyncIterableQuery<T>;
Parameters
selector
- (optional) a value transformer function to be used for comparisons
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [[1, 2, 3], [4, 5]];
}
(async function () {
const q = await itiririAsync(generator()).flat().awaitAll();
q.toArray(); // returns [1, 2, 3, 4, 5]
})();
flat
is a deferred method and is executed only when the result sequence is iterated.
Runs through every element and applies a given function.
Syntax
forEach(action: (element: T, index: number) => void): Promise<void>;
Parameters
action
- (required) function to apply on each element
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
await itiririAsync(generator()).forEach(elem => console.log(elem));
})();
// 1
// 2
// 3
Returns a sequence of correlated elements where each element from the current sequence is matched with zero or more elements from the other sequence.
Syntax
groupJoin<TKey, TRight, TResult>(
other: Iterable<TRight>,
leftKeySelector: (element: T, index: number) => TKey,
rightKeySelector: (element: TRight, index: number) => TKey,
joinSelector: (left: T, right: TRight[]) => TResult,
): AsyncIterableQuery<TResult>;
Parameters
other
- (required) sequence to joinleftKeySelector
- (required) function that provides the key of each element from source sequencerightKeySelector
- (required) function that provides the key of each element from joined sequencejoinSelector
- (required) a transformation function to apply on each joined element with group
The joinSelector
function is called on each element from the source sequence and the array of matched
elements from the joined sequence.
When an element from the source sequence doesn't match with any of the elements from the joined sequence,
the joinSelector
function will be called with an empty array.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
const q = await itiririAsync(generator())
.groupJoin([1, 2, 3, 1, 1, 2], x => x, x => x, (x, y) => ({ x, y }))
.awaitAll();
q.toArray();
})();
//[ { x: 1, y: [ 1, 1, 1 ] },
// { x: 2, y: [ 2, 2 ] },
// { x: 3, y: [ 3 ] } ]
groupJoin
is a deferred method and is executed only when the result sequence is iterated.
Determines whether the sequence includes a certain element.
Syntax
includes(element: T): Promise<boolean>;
includes(element: T, fromIndex: number): Promise<boolean>;
Parameters
element
- (required) the element to search forfromIndex
- (optional) starting index, defaults to0
includes
uses triple equals ===
to compare elements.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
await itiririAsync(generator()).includes(2); // returns: true
await itiririAsync(generator()).includes(4); // returns: false
})();
Returns the first (zero-based) index at which a given element can be found.
Syntax
indexOf(element: T): Promise<number>;
indexOf(element: T, fromIndex: number): Promise<number>;
Parameters
element
- (required) the element to search forfromIndex
- (optional) starting index, defaults to0
When an element is not found, returns -1.
indexOf
uses triple equals ===
to compare elements.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
await itiririAsync(generator()).indexOf(2); // returns: 1
await itiririAsync(generator()).indexOf(4); // returns: -1
})();
Returns a set intersection with a given sequence.
Syntax
intersect(others: Iterable<T>): AsyncIterableQuery<T>;
intersect<S>(other: Iterable<T>, selector: (element: T) => S): AsyncIterableQuery<T>;
Parameters
other
- (required) the sequence to intersect withselector
- (optional) a value transformer function to be used for comparisons
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
const q = await itiririAsync(generator())
.intersect([1, 2, 4])
.awaitAll();
q.toArray(); // returns: [1, 2]
})();
intersect
is a deferred method and is executed only when the result sequence is iterated.
Returns a sequence of correlated elements transformation that match a given key.
Syntax
join<TKey, TRight, TResult>(
other: Iterable<TRight>,
leftKeySelector: (element: T, index: number) => TKey,
rightKeySelector: (element: TRight, index: number) => TKey,
joinSelector: (left: T, right: TRight) => TResult,
): AsyncIterableQuery<TResult>;
Parameters
other
- (required) sequence to joinleftKeySelector
- (required) function that provides the key of each element from source sequencerightKeySelector
- (required) function that provides the key of each element from joined sequencejoinSelector
- (required) a transformation function to apply on each matched tuple
The join
method works as an sql inner join.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
const q = await itiririAsync(generator())
.join([1, 1, 2], x => x, x => x, (x, y) => ({ x, y }))
.awaitAll();
q.toArray(); // returns: [ { x: 1, y: 1 }, { x: 1, y: 1 }, { x: 2, y: 2 } ]
})();
join
is a deferred method and is executed only when the result sequence is iterated.
Returns a sequence of keys for each index in the source sequence.
Syntax
keys(): AsyncIterableQuery<number>;
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* ['a', 'b', 'c'];
}
(async function () {
const q = await itiririAsync(generator()).keys().awaitAll();
q.toArray(); // returns: [0, 1, 2]
})();
keys
is a deferred method and is executed only when the result sequence is iterated.
Returns the last element in a sequence.
Syntax
last(): Promise<T>;
For an empty sequence returns undefined
.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, -2];
}
(async function () {
await itiririAsync(generator()).last(); // returns: -2
})();
Returns the last index at which a given element can be found.
Syntax
lastIndexOf(element: T): Promise<number>;
lastIndexOf(element: T, fromIndex: number): Promise<number>;
Parameters
element
- (required) the element to search forfromIndex
- (optional) starting index, defaults to0
When an element is not found, returns -1.
lastIndexOf
uses triple equals ===
to compare elements.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, 2, 1];
}
(async function () {
await itiririAsync(generator()).lastIndexOf(2); // returns: 3
})();
Returns a sequence of correlated elements transformation that match a given key.
Syntax
leftJoin<TKey, TRight, TResult>(
other: Iterable<TRight>,
leftKeySelector: (element: T, index: number) => TKey,
rightKeySelector: (element: TRight, index: number) => TKey,
joinSelector: (left: T, right?: TRight) => TResult,
): AsyncIterableQuery<TResult>;
Parameters
other
- (required) sequence to joinleftKeySelector
- (required) function that provides the key of each element from source sequencerightKeySelector
- (required) function that provides the key of each element from joined sequencejoinSelector
- (required) a transformation function to apply on each matched tuple
The leftJoin
method works as an sql left join.
When an element from the left sequence doesn't match with any of the elements from the right sequence,
the joinSelector
function is called with an undefined
right value.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
const q = await itiririAsync(generator())
.leftJoin([2, 3, 4, 2], n => n, n => n, (a, b) => `${a}-${b || '#'}`)
.awaitAll();
q.toArray(); // returns ['1-#', '2-2', '2-2', '3-3']
})();
leftJoin
is a deferred method and is executed only when the result sequence is iterated.
Returns the number of elements in a sequence.
Syntax
length(): Promise<number>;
length(predicate: (element: T, index: number) => boolean): Promise<number>;
Parameters
predicate
- (optional) a function to count only the elements that match the predicate
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
await itiririAsync(generator()).length(); // returns 3
})();
Returns a sequence of transformed values.
Syntax
map<S>(selector: (element: T, index: number) => S): AsyncIterableQuery<S>;
Parameters
selector
- (required) a value transformer function to apply to each element
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
function x10(numbers: AsyncIterable<number>) {
return itiririAsync(numbers).map(n => n * 10);
}
(async function(){
const numbers = await x10(generator()).awaitAll();
console.log(numbers); // [10, 20, 30]
})();
map
is a deferred method and is executed only when the result sequence is iterated.
Returns the maximum element in a sequence.
Syntax
max(): Promise<T>;
max(compareFn: (a: T, b: T) => number): Promise<T>;
Parameters
compareFn
- (optional) a comparer function that compares two elements from a sequence and returns:-1
whena
is less thanb
1
whena
is greaterb
0
whena
equals tob
If sequence is empty, returns undefined
.
Example
async function* generator1() {
yield* [1, 42, 3];
}
async function* generator2() {
yield* [];
}
(async function () {
await itiririAsync(generator1()).max(); // returns 42
await itiririAsync(generator2()).max(); // returns undefined
})();
Returns the minimum element in a sequence.
Syntax
min(): Promise<T>;
min(compareFn: (a: T, b: T) => number): Promise<T>;
Parameters
compareFn
- (optional) a comparer function that compares two elements from a sequence and returns:-1
whena
is less thanb
1
whena
is greaterb
0
whena
equals tob
If sequence is empty, returns undefined
.
Example
import itiririAsync from 'itiriri-async';
async function* generator1() {
yield* [1, -2, 3];
}
async function* generator2() {
yield* [];
}
(async function () {
await itiririAsync(generator1()).min(); // returns -1
await itiririAsync(generator2()).min(); // returns undefined
})();
Returns the element at a specified index.
Syntax
nth(index: number): Promise<T>;
Parameters
index
- (required) zero based index at which to get the element
If index is out of the range, returns undefined
.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, -2, 3];
}
(async function () {
await itiririAsync(generator()).nth(2); // returns: 3
await itiririAsync(generator()).nth(3); // returns: undefined
})();
Returns a sequence with given elements at the beginning.
Syntax
prepend(other: T): AsyncIterableQuery<T>;
prepend(other: Promise<T>): AsyncIterableQuery<T>;
prepend(other: Iterable<T>): AsyncIterableQuery<T>;
prepend(other: AsyncIterable<T>): AsyncIterableQuery<T>;
Parameters
other
- (required) the sequence to be added at the beginning
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, -2, 3];
}
(async function () {
const q = await itiririAsync(generator()).prepend(4).awaitAll();
q.toArray(); // returns: [4, 1, -2, 3]
})();
(async function () {
const q = await itiririAsync(generator()).prepend([0, 4]).awaitAll();
q.toArray(); // returns: [0, 4, 1, -2, 3]
})();
prepend
is a deferred method and is executed only when the result sequence is iterated.
Applies a function against an accumulator and each element (from left to right) to reduce it to a single value.
Syntax
reduce(
callback: (accumulator: T, current: T, index: number) => T,
): Promise<T>;
reduce<S>(
callback: (accumulator: S, current: T, index: number) => S,
initialValue: S,
): Promise<S>;
Parameters
callback
- (required) function to execute on each element in the sequence, taking three argumentsaccumulator
the accumulator accumulates the callback's return values;current
the current element being processed;currentIndex
the index of the current element being processed;
initialValue
- (optional) value to use as the first argument to the first call of thecallback
Calling reduce
on an empty sequence without an initial value throws an error.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
// 5 + 10 + 20 + 30
await itiririAsync(generator()).reduce((accum, elem) => accum + elem * 10, 5); // returns 65
})();
Skips the specified number of elements from the beginning of sequence and returns the remaining ones.
Syntax
skip(count: number): AsyncIterableQuery<T>;
Parameters
count
- (required) number of elements to skip
When count is greater than actual number of elements, results in an empty sequence.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
const q = await itiririAsync(generator()).skip(1).awaitAll();
q.toArray(); // returns: [2, 3]
})();
(async function () {
const q = await itiririAsync(generator()).skip(10).awaitAll();
q.toArray(); // returns: []
})();
skip
is a deferred method and is executed only when the result sequence is iterated.
Returns a sequence that represents the range of elements from start to end.
Syntax
slice(start: number, end: number): AsyncIterableQuery<T>;
Parameters
start
- (required) zero-based index at which to begin extractionend
- (required) zero-based index before which to end extraction.
The end
index is not included in the result.
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, 3, 4];
}
(async function () {
const q = await itiririAsync(generator()).slice(2, 4).awaitAll();
q.toArray(); // returns: [3, 3]
})();
slice
is a deferred method and is executed only when the result sequence is iterated.
Tests whether at least one element passes the predicate.
Syntax
some(predicate: (element: T, index: number) => boolean): Promise<boolean>;
Parameters
predicate
- (required) function to test for each element
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3, -3, 4, 0];
}
(async function () {
await itiririAsync(generator()).some(x => x < 0); // returns: true
await itiririAsync(generator()).some(x => x > 5); // returns: false
})();
Returns the sum of all elements.
Syntax
sum(): number;
sum(selector: (element: T, index: number) => number): Promise<number>;
Parameters
selector
- (optional) a value transformer function to apply to each element
Optionally, a function can be provided to apply a transformation and map each element to a value.
Example
import itiririAsync from 'itiriri-async';
async function* generator1() {
yield* [1, 2, 3];
}
async function* generator2() {
yield* [{ val: 3 }, { val: 5 }];
}
(async function () {
await itiririAsync(generator1()).sum(); // returns: 6
await itiririAsync(generator2()).sum(x => x.val); // returns: 8
})();
Returns a specified number of elements from the beginning of sequence.
Syntax
take(count: number): AsyncIterableQuery<T>;
Parameters
count
- (required) number of elements to take
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 2, 3];
}
(async function () {
const q = await itiririAsync(generator()).take(2).awaitAll();
q.toArray(); // returns: [1, 2]
})();
(async function () {
const q = await itiririAsync(generator()).take(0).awaitAll();
q.toArray(); // returns: []
})();
take
is a deferred method and is executed only when the result sequence is iterated.
Returns a set union with a given sequence.
Syntax
union(other: AsyncIterable<T>): AsyncIterableQuery<T>;
union<S>(other: AsyncIterable<T>, selector: (element: T) => S): AsyncIterableQuery<T>;
Parameters
other
- (required) the sequence to join withselector
- (optional) a value transformer function to be used for comparisons
Example
import itiririAsync from 'itiriri-async';
async function* generator1() {
yield* [1, 2, 3];
}
async function* generator2() {
yield* [3, 4, 5];
}
(async function () {
const q = await itiririAsync(generator1()).union(generator2()).awaitAll();
q.toArray(); // returns [1, 2, 3, 4, 5]
})();
union
is a deferred method and is executed only when the result sequence is iterated.
Returns a sequence of values for each index in the source sequence.
Syntax
values(): AsyncIterableQuery<T>;
Example
import itiririAsync from 'itiriri-async';
async function* generator() {
yield* [1, 0, 2, 3];
}
(async function () {
const q = await itiririAsync(generator()).values().awaitAll();
q.toArray(); // [1, 0, 2, 3]
})();
values
is a deferred method and is executed only when the result sequence is iterated.