From f9a77c5c27aede4e5978eb55d9b7af781b680a1d Mon Sep 17 00:00:00 2001 From: João Augusto Costa Branco Marado Torres Date: Tue, 24 Jun 2025 12:08:41 -0300 Subject: feat!: initial commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Augusto Costa Branco Marado Torres --- src/utils/iterator.ts | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/utils/iterator.ts (limited to 'src/utils/iterator.ts') diff --git a/src/utils/iterator.ts b/src/utils/iterator.ts new file mode 100644 index 0000000..fa58fc9 --- /dev/null +++ b/src/utils/iterator.ts @@ -0,0 +1,52 @@ +export type MaybeIterable = T | Iterable; +export type NonEmptyArray = [T, ...T[]]; +export type AsyncYieldType = T extends AsyncGenerator ? U : never; + +export function surelyIterable(maybe: MaybeIterable): Iterable { + return typeof maybe === "object" && maybe !== null && Symbol.iterator in maybe + ? maybe + : [maybe]; +} + +export async function* createAsyncIterator( + promises: Promise[], +): AsyncGenerator { + for (const promise of promises) { + yield promise; + } +} + +export function filterDuplicate( + array: Iterable, + key: (i: T) => K, +): T[] { + const seen = new Map(); + for (const i of array) { + const id = key(i); + if (!seen.has(id)) { + seen.set(id, i); + } + } + return Array.from(seen.values()); +} + +export async function findMapAsync( + iter: Iterable, + predicate: (value: T) => Promise, +): Promise { + const arr = Array.from(iter); + + async function tryNext(index: number): Promise { + if (index >= arr.length) { + return await Promise.resolve(undefined); + } + + try { + return await predicate(arr[index]); + } catch { + return tryNext(index + 1); + } + } + + return await tryNext(0); +} -- cgit v1.2.3