Class AsyncIterableCollection<TInput>

All methods that return IAsyncCollection are executed lazly. The methods that return IAsyncCollection will only be executed when forEach method is called or for await loop. The methods that return PromiseLike object will execute only when awaited or then method is called.

Type Parameters

  • TInput = unknown

Implements

Constructors

  • The constructor takes an Iterable or AsyncIterable.

    Works with Array.

    Type Parameters

    • TInput = unknown

    Parameters

    Returns AsyncIterableCollection<TInput>

    import { AsyncIterableCollection } from "@daiso-tech/core";

    const collection = new AsyncIterableCollection([1, 2, 3, 4]);

    Works with String.

    import { AsyncIterableCollection } from "@daiso-tech/core";

    const collection = new AsyncIterableCollection("ABCDE");

    Works with Set.

    import { AsyncIterableCollection } from "@daiso-tech/core";

    const collection = new AsyncIterableCollection(new Set([1, 2, 2 4]));

    Works with Map.

    import { AsyncIterableCollection } from "@daiso-tech/core";

    const collection = new AsyncIterableCollection(new Map([["a", 1], ["b", 2]]));

    Works with any Iterable.

    import { AsyncIterableCollection } from "@daiso-tech/core";

    class MyIterable implements Iterable<number> {
    *[Symbol.iterator](): Iterator<number> {
    yield 1;
    yield 2;
    yield 3;
    }
    }
    const collection = new AsyncIterableCollection(new MyIterable());

    Works with any AsyncIterable.

    import { AsyncIterableCollection } from "@daiso-tech/core";

    class MyIterable implements AsyncIterable<number> {
    async *[Symbol.iterator](): Iterator<number> {
    yield 1;
    yield 2;
    yield 3;
    }
    }
    const collection = new AsyncIterableCollection(new MyIterable());

Methods

  • The after method returns the item that comes after the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the last item then null is returned.

    Parameters

    Returns LazyPromise<null | TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .after(item => item === 2);
    // 3
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .after(item => item === 4);
    // null
    }
  • The afterOr method returns the item that comes after the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the last item then defaultValue is returned.

    Type Parameters

    Parameters

    Returns LazyPromise<TInput | TExtended>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .afterOr(-1, item => item === 2);
    // 3
    }

    You can pass a function as default value.

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .afterOr(() => -1, item => item === 4);
    // -1
    }

    You can pass an async function as default value.

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .afterOr(async () => -1, item => item === 4);
    // -1
    }

    You can pass a LazyPromise as default value.

    import type { IAsyncCollection, ICache } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>, cache: ICache<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .afterOr(cache.get("a"), item => item > 10);
    // -1
    }
  • The afterOrFail method returns the item that comes after the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the last item then an error is thrown.

    Parameters

    Returns LazyPromise<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .afterOrFail(item => item === 2);
    // 3
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .afterOrFail(item => item === 4);
    // error is thrown
    }
  • The before method returns the item that comes before the first item that matches predicateFn. If the predicateFn does not match or matches the first item then null is returned.

    Parameters

    Returns LazyPromise<null | TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .before(item => item === 2);
    // 1
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .before(item => item === 1);
    // null
    }
  • The beforeOr method returns the item that comes before the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the first item then defaultValue is returned.

    Type Parameters

    Parameters

    Returns LazyPromise<TInput | TExtended>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .beforeOr(-1, item => item === 2);
    // 1
    }

    You can pass a function as default value.

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .beforeOr(() => -1, item => item === 1);
    // -1
    }

    You can pass an async function as default value.

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .beforeOr(async () => -1, item => item === 1);
    // -1
    }

    You can pass a LazyPromise as default value.

    import type { IAsyncCollection, ICache } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>, cache: ICache<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .beforeOr(cache.get("a"), item => item > 10);
    // -1
    }
  • The beforeOrFail method returns the item that comes before the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the first item then an error is thrown.

    Parameters

    Returns LazyPromise<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .beforeOrFail(item => item === 2);
    // 1
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .beforeOrFail(item => item === 1);
    // error is thrown
    }
  • The countBy method counts the occurrences of values in the collection by selectFn . By default the equality check occurs on the item.

    Type Parameters

    Parameters

    Returns IAsyncCollection<[TOutput, number]>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append(["a", "a", "a", "b", "b", "c"])
    .countBy()
    .map(([key, collection]) => [key, collection.toArray()])
    .toArray();
    // [
    // ["a", 3],
    // ["b", 2],
    // ["c", 1]
    // ]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["alice@gmail.com", "bob@yahoo.com", "carlos@gmail.com"])
    .countBy(item => item.split("@")[1])
    .toArray();
    // [
    // ["gmail.com", 2],
    // ["yahoo.com", 1]
    // ]
    }
  • The delay method will add delay between each iteration. This method is especially useful for situations where you may be interacting with external APIs that rate limit incoming requests:

    Parameters

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    class MyIterable implements Iterable<number> {
    async *[Symbol.asyncIterator]() {
    for (let i = 0; i < 10; i++) {
    yield i;
    }
    }
    }

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    const myIterable = new MyIterable();
    await collection
    .append(myIterable)
    .delay(1000)
    .forEach(user => console.log(user))
    }
  • The difference method will return the values in the original collection that are not present in iterable. By default the equality check occurs on the item.

    Type Parameters

    Parameters

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 2, 3, 4, 5])
    .difference([2, 4, 6, 8])
    .toArray();
    // [1, 3, 5]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    type Phone = {
    name: string;
    brand: string;
    type: string;
    };

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<Phone>): Promise<void> {
    await collection
    .append([
    { name: "iPhone 6", brand: "Apple", type: "phone" },
    { name: "iPhone 5", brand: "Apple", type: "phone" },
    { name: "Apple Watch", brand: "Apple", type: "watch" },
    { name: "Galaxy S6", brand: "Samsung", type: "phone" },
    { name: "Galaxy Gear", brand: "Samsung", type: "watch" },
    ])
    .difference(
    [
    { name: "Apple Watch", brand: "Apple", type: "watch" },
    ],
    (product) => product.type
    )
    .toArray();
    // [
    // { name: "iPhone 6", brand: "Apple", type: "phone" },
    // { name: "iPhone 5", brand: "Apple", type: "phone" },
    // { name: "Galaxy S6", brand: "Samsung", type: "phone" },
    // ]
    }
  • The first method returns the first item in the collection that passes predicateFn . By default it will get the first item. If the collection is empty or no items passes predicateFn than null i returned.

    Type Parameters

    • TOutput

    Parameters

    Returns LazyPromise<null | TOutput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .first();
    // 1
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .first(item => item > 2);
    // 3
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .first(item => item > 10);
    // null
    }
  • The firstOr method returns the first item in the collection that passes predicateFn By default it will get the first item. If the collection is empty or no items passes predicateFn than defaultValue .

    Type Parameters

    Parameters

    Returns LazyPromise<TOutput | TExtended>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .firstOr(-1);
    // 1
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .firstOr(-1, item => item > 2);
    // 3
    }

    You can pass a function as default value.

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .firstOr(() => -1, item => item > 10);
    // -1
    }

    You can pass an async function as default value.

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .firstOr(async () => -1, item => item > 10);
    // -1
    }

    You can pass a LazyPromise as default value.

    import type { IAsyncCollection, ICache } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>, cache: ICache<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .firstOr(cache.get("a"), item => item > 10);
    // -1
    }
  • The firstOrFail method returns the first item in the collection that passes predicateFn . By default it will get the first item. If the collection is empty or no items passes predicateFn than error is thrown.

    Type Parameters

    • TOutput

    Parameters

    Returns LazyPromise<TOutput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .firstOrFail();
    // 1
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .firstOrFail(item => item > 2);
    // 3
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .firstOrFail(item => item > 10);
    // throws an error
    }
  • The get method returns the item by index. If the item is not found null will returned.

    Parameters

    • index: number

    Returns LazyPromise<null | TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    collection = collection.append([1, 4, 2, 8, -2]);

    // Will be 2
    await collection.get(2);

    // Will be null
    await collection.get(5);
    }
  • The groupBy method groups the collection's items by selectFn . By default the equality check occurs on the item.

    Type Parameters

    Parameters

    Returns IAsyncCollection<[TOutput, IAsyncCollection<TInput>]>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["a", "a", "a", "b", "b", "c"])
    .groupBy()
    .map(([key, collection]) => [key, collection.toArray()])
    .toArray();
    // [
    // [
    // "a",
    // ["a", "a", "a"]
    // ],
    // [
    // "b",
    // ["b", "b"]
    // ],
    // [
    // "c",
    // ["c"]
    // ]
    // ]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["alice@gmail.com", "bob@yahoo.com", "carlos@gmail.com"])
    .groupBy(item => item.split("@")[1])
    .map(([key, collection]) => [key, collection.toArray()])
    .toArray();
    // [
    // [
    // "gmail.com",
    // ["alice@gmail.com", "carlos@gmail.com"]
    // ],
    // [
    // "yahoo.com",
    // ["bob@yahoo.com"]
    // ]
    // ]
    }
  • The join method joins the collection's items with separator . An error will be thrown when if a none string item is encounterd.

    Parameters

    • separator: string = ","

    Returns LazyPromise<Extract<TInput, string>>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .map(item => item.toString())
    .join();
    // "1,2,3,4"
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .map(item => item.toString())
    .join("_");
    // "1_2_3_4"
    }
  • The last method returns the last item in the collection that passes predicateFn . By default it will get the last item. If the collection is empty or no items passes predicateFn than null i returned.

    Type Parameters

    • TOutput

    Parameters

    Returns LazyPromise<null | TOutput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .last();
    // 4
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .last(item => item < 4);
    // 3
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .last(item => item > 10);
    // null
    }
  • The lastOr method returns the last item in the collection that passes predicateFn . By default it will get the last item. If the collection is empty or no items passes predicateFn than defaultValue .

    Type Parameters

    Parameters

    Returns LazyPromise<TOutput | TExtended>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .lastOr(-1);
    // 4
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .lastOr(-1, item => item < 4);
    // 3
    }

    You can pass a function as default value.

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .lastOr(() => -1, item => item > 10);
    // -1
    }

    You can pass an async function as default value.

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .lastOr(async () => -1, item => item > 10);
    // -1
    }

    You can pass a LazyPromise as default value.

    import type { IAsyncCollection, ICache } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>, cache: ICache<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .lastOr(cache.get("a"), item => item > 10);
    // -1
    }
  • The lastOrFail method returns the last item in the collection that passes predicateFn . By default it will get the last item. If the collection is empty or no items passes predicateFn than error is thrown.

    Type Parameters

    • TOutput

    Parameters

    Returns LazyPromise<TOutput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .lastOrFail();
    // 4
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .lastOrFail(item => item < 4);
    // 3
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4])
    .lastOrFail(item => item > 10);
    // throws an error
    }
  • The padEnd method pads this collection with fillItems until the resulting collection size reaches maxLength. The padding is applied from the end of this collection.

    Type Parameters

    Parameters

    Returns IAsyncCollection<TInput | TExtended>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append("abc")
    .padEnd(10, "foo")
    .join("");
    // "abcfoofoof"
    }
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append("abc")
    .padEnd(6, "123465")
    .join("");
    // "abc123"
    }
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append("abc")
    .padEnd(8, "0")
    .join("");
    // "abc00000"
    }
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append("abc")
    .padEnd(1, "_")
    .join("");
    // "abc"
    }
  • The padStart method pads this collection with fillItems until the resulting collection size reaches maxLength. The padding is applied from the start of this collection.

    Type Parameters

    Parameters

    Returns IAsyncCollection<TInput | TExtended>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append("abc")
    .padStart(10, "foo")
    .join("");
    // "foofoofabc"
    }
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append("abc")
    .padStart(6, "123465")
    .join("");
    // "123abc"
    }
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append("abc")
    .padStart(8, "0")
    .join("");
    // "00000abc"
    }
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append("abc")
    .padStart(1, "_")
    .join("");
    // "abc"
    }
  • The pipe method passes the orignal collection to callback and returns the result from callback. This method is useful when you want compose multiple smaller functions.

    Type Parameters

    Returns LazyPromise<TOutput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    function toNbrs<TInput>(
    collection: IAsyncCollection<TInput>,
    ): IAsyncCollection<number> {
    return collection
    .map((item) => Number(item))
    .reject((nbr) => Number.isNaN(nbr));
    }
    function nbrToStr(collection: IAsyncCollection<number>): number[] {
    return collection.repeat(2).toArray();
    }
    await collection
    .append([1, "2", "a", 1, 3, {}])
    .pipe(toNbrs)
    .then(nbrToStr);
    // [ 1, 2, 1, 3 ]
    }
  • The reverse method will reverse the order of the collection. The reversing of the collection will be applied in chunks that are the size of chunkSize .

    Parameters

    • OptionalchunkSize: number

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([-1, 2, 4, 3])
    .reverse()
    .toArray();
    // [3, 4, 2, -1]
    }
  • The set method changes a item by i>index using value.

    Parameters

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4, 5])
    .set(1, -1)
    .toArray();
    // [1, -1, 3, 4, 5]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4, 5])
    .set(1, (prevValue) => prevValue - 2)
    .toArray();
    // [1, 0, 3, 4, 5]
    }
  • The slice method creates porition of the original collection selected from start and end where start and end (end not included) represent the index of items in the collection.

    Parameters

    • Optionalstart: number
    • Optionalend: number

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["a", "b", "c", "d", "e", "f"])
    .slice(3)
    .toArray();
    // ["d", "e", "f"]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["a", "b", "c", "d", "e", "f"])
    .slice(undefined, 2)
    .toArray();
    // ["a", "b"]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["a", "b", "c", "d", "e", "f"])
    .slice(2, 5)
    .toArray();
    // ["c", "d", "e"]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["a", "b", "c", "d", "e", "f"])
    .slice(-2)
    .toArray();
    // ["e", "f"]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["a", "b", "c", "d", "e", "f"])
    .slice(undefined, -2)
    .toArray();
    // ["a", "b", "c", "d"]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["a", "b", "c", "d", "e", "f"])
    .slice(-4, -2)
    .toArray();
    // ["c", "d"]
    }
  • The sole method returns the first item in the collection that passes predicateFn, but only if predicateFn matches exactly one item. If no items matches or multiple items are found an error will be thrown.

    Type Parameters

    • TOutput

    Returns LazyPromise<TOutput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4, 5])
    .sole(item => item === 4);
    // 4
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4, 4, 5])
    .sole(item => item === 4);
    // error is thrown
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 5])
    .sole(item => item === 4);
    // error is thrown
    }
  • The sort method sorts the collection. You can provide a comparator function.

    Parameters

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    type Person = {
    name: string;
    age: number;
    };

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<Person>): Promise<void> {
    await collection
    .append([-1, 2, 4, 3])
    .sort()
    .toArray();
    // [-1, 2, 3, 4]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([
    { name: "Anders", age: 30 },
    { name: "Joe", age: 20 },
    { name: "Hasan", age: 25 },
    { name: "Linda", age: 19 }
    ])
    .sort(({ age: ageA }, { age: ageB }) => ageA - ageB)
    .toArray();
    // [
    // { name: "Linda", age: 19 }
    // { name: "Joe", age: 20 },
    // { name: "Hasan", age: 25 },
    // { name: "Anders", age: 30 },
    // ]
    }
  • The split method breaks a collection evenly into chunkAmount of chunks.

    Parameters

    • chunkAmount: number

    Returns IAsyncCollection<IAsyncCollection<TInput>>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4, 5])
    .split(3)
    .map(chunk => chunk.toArray())
    .toArray();
    // [[1, 2], [3, 4], [5]]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4, 5, 6])
    .split(3)
    .map(chunk => chunk.toArray())
    .toArray();
    // [[1, 2], [3, 4], [5, 6]]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([1, 2, 3, 4, 5, 6, 7])
    .split(3)
    .map(chunk => chunk.toArray())
    .toArray();
    // [[1, 2, 7], [3, 4], [5, 6]]
  • The take method takes the first limit items.

    Parameters

    • limit: number

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([0, 1, 2, 3, 4, 5])
    .take(3)
    .toArray();
    // [0, 1, 2]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([0, 1, 2, 3, 4, 5])
    .take(-2)
    .toArray();
    // [0, 1, 2, 3]
    }
  • Experimental

    The takeUntilAbort method returns a new collection that will iterate values until aborted by passing in AbortSignal. After when aborted, the collection will stop iterating:

    Parameters

    • abortSignal: AbortSignal

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    class InfiniteIterable implements Iterable<number> {
    async *[Symbol.asyncIterator]() {
    let index = 0;
    while(true) {
    index++;
    yield index;
    }
    }
    }

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    const abortController = new AbortController();
    setTimeout(() => {
    abortController.abort("My abort error");
    }, 1000)
    const infiniteIterable = new InfiniteIterable();
    await collection
    .append(infiniteIterable);
    .takeUntilAbort(abortController)
    .forEach(nbr => console.log(nbr))
    }
  • Experimental

    The takeUntilTimeout method returns a new collection that will iterate values until the specified time. After that time, the collection will stop iterating:

    Parameters

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    class InfiniteIterable implements AsyncIterable<number> {
    async *[Symbol.asyncIterator]() {
    let index = 0;
    while(true) {
    index++;
    yield index;
    }
    }
    }

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    const infiniteIterable = new InfiniteIterable();
    await collection
    .append(infiniteIterable)
    .takeUntilTimeout(1000)
    .forEach(nbr => console.log(nbr))
    }
  • The unique method removes all duplicate values from the collection by selectFn . By default the equality check occurs on the item.

    Type Parameters

    Parameters

    Returns IAsyncCollection<TInput>

    import type { IAsyncCollection } from "@daiso-tech/core";

    type Phone = {
    name: string;
    brand: string;
    type: string;
    };

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<Phone>): Promise<void> {
    await collection
    .append([1, 1, 2, 2, 3, 4, 2])
    .unique()
    .toArray();
    // [1, 2, 3, 4]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<number>): Promise<void> {
    await collection
    .append([
    { name: "iPhone 6", brand: "Apple", type: "phone" },
    { name: "iPhone 5", brand: "Apple", type: "phone" },
    { name: "Apple Watch", brand: "Apple", type: "watch" },
    { name: "Galaxy S6", brand: "Samsung", type: "phone" },
    { name: "Galaxy Gear", brand: "Samsung", type: "watch" },
    ])
    .unique(item => item.brand)
    .toArray();
    // [
    // { name: "iPhone 6", brand: "Apple", type: "phone" },
    // { name: "Galaxy S6", brand: "Samsung", type: "phone" },
    // ]
    }
  • The zip method merges together the values of iterable with the values of the collection at their corresponding index. The returned collection has size of the shortest collection.

    Type Parameters

    • TExtended

    Parameters

    Returns IAsyncCollection<[TInput, TExtended]>

    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["Chair", "Desk"])
    .zip([100, 200])
    .toArray();
    // [["Chair", 100], ["Desk", 200]]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["Chair", "Desk", "Couch"])
    .zip([100, 200])
    .toArray();
    // [["Chair", 100], ["Desk", 200]]
    }
    import type { IAsyncCollection } from "@daiso-tech/core";

    // Asume the inputed collection is empty.
    async function main(collection: IAsyncCollection<string>): Promise<void> {
    await collection
    .append(["Chair", "Desk"])
    .zip([100, 200, 300])
    .toArray();
    // [["Chair", 100], ["Desk", 200]]
    }
  • The concat static method is a convenient utility for easily concatenating multiple Iterable or AsyncIterable.

    Type Parameters

    • TValue

    Returns IAsyncCollection<TValue>

    import { AsyncIterableCollection } from "@daiso-tech/core";

    class MyAsyncIterable implements AsyncIterable<number> {
    async *[Symbol.iterator](): Iterator<number> {
    yield "a";
    yield "b";
    yield "c";
    }
    }

    class MyIterable implements Iterable<number> {
    *[Symbol.iterator](): Iterator<number> {
    yield 1;
    yield 2;
    yield 3;
    }
    }

    const collection = AsyncIterableCollection.concat([
    new MyAsyncIterable(),
    new MyIterable(),
    new Set([1, 2, 3]),
    new Map([["a", 1], ["b", 2]]),
    ["a", "b", "c"]
    ]);
    await collection.toArray();
    // ["a", "b", "c", 1, 2, 3, 1, 2, 3, ["a", 1], ["b", 2], "a", "b", "c"]
  • The difference static method is used to compute the difference between two Iterable instances. By default, the equality check is performed on each item.

    Type Parameters

    • TValue
    • TSelect

    Parameters

    Returns IAsyncCollection<TValue>

    import { AsyncIterableCollection } from "@daiso-tech/core";

    const collection = AsyncIterableCollection.difference(
    [1, 2, 2, 3, 4, 5],
    [2, 4, 6, 8]
    );
    await collection.toArray();
    // [1, 3, 5]
    import { AsyncIterableCollection } from "@daiso-tech/core";

    const collection = AsyncIterableCollection.difference(
    [
    { name: "iPhone 6", brand: "Apple", type: "phone" },
    { name: "iPhone 5", brand: "Apple", type: "phone" },
    { name: "Apple Watch", brand: "Apple", type: "watch" },
    { name: "Galaxy S6", brand: "Samsung", type: "phone" },
    { name: "Galaxy Gear", brand: "Samsung", type: "watch" },
    ],
    [
    { name: "Apple Watch", brand: "Apple", type: "watch" },
    ],
    (product) => product.type
    );
    await collection.toArray();
    // [
    // { name: "iPhone 6", brand: "Apple", type: "phone" },
    // { name: "iPhone 5", brand: "Apple", type: "phone" },
    // { name: "Galaxy S6", brand: "Samsung", type: "phone" },
    // ]
  • The zip static method merges together the values of iterableA with the values of the iterableB at their corresponding index. The returned collection has size of the shortest collection.

    Type Parameters

    • TValueA
    • TValueB

    Parameters

    Returns IAsyncCollection<[TValueA, TValueB]>

    import { AsyncIterableCollection } from "@daiso-tech/core";;

    const collection = AsyncIterableCollection.zip(["Chair", "Desk"], [100, 200]);
    await collection.toArray();
    // [["Chair", 100], ["Desk", 200]]
    import { AsyncIterableCollection } from "@daiso-tech/core";;

    const collection = AsyncIterableCollection.zip(["Chair", "Desk", "Couch"], [100, 200]);
    await collection.toArray();
    // [["Chair", 100], ["Desk", 200]]
    import { AsyncIterableCollection } from "@daiso-tech/core";;

    const collection = AsyncIterableCollection.zip(["Chair", "Desk"], [100, 200, 300]);
    await collection.toArray();
    // [["Chair", 100], ["Desk", 200]]