blob: 2538e3d6b920c45b3f5caa746d07db73b59cb5ba [file] [log] [blame]
// This module contains async versions of various built-in JavaScript functions and methods.
/** Async version of Array.prototype.find(), where the callback function returns a promise. */
export async function asyncFind<T>(
items: T[] | Promise<T[]>,
predicate: (item: T, index: number) => Promise<boolean>): Promise<T | null> {
if (!items) {
return null;
}
const actualItems = items instanceof Promise ? await items : items;
for (let i = 0; i < actualItems.length; i++) {
if (await (predicate(actualItems[i], i))) {
return actualItems[i];
}
}
return null;
}
/** Async version of Array.prototype.filter(), where the callback function returns a promise. */
export async function asyncFilter<T>(
items: T[] | Promise<T[]>,
predicate: (item: T, index: number) => Promise<boolean>): Promise<T[]> {
if (!items) {
return [];
}
const actualItems = items instanceof Promise ? await items : items;
const filteredItems: T[] = [];
for (let i = 0; i < actualItems.length; i++) {
if (await (predicate(actualItems[i], i))) {
filteredItems.push(actualItems[i]);
}
}
return filteredItems;
}
/** Async version of Array.prototype.map(), where the callback function returns a promise. */
export async function asyncMap<F, T>(
items: F[] | Promise<F[]>,
fn: (from: F, index: number) => Promise<T>): Promise<T[]> {
if (!items) {
return [];
}
const actualItems = items instanceof Promise ? await items : items;
return Promise.all(actualItems.map(fn));
}
/** Async version of Array.prototype.forEach(), where the callback function returns a promise. */
export async function asyncForEach<T>(
items: T[] | Promise<T[]>,
fn: (item: T, index: number) => Promise<void>): Promise<void> {
await asyncMap(items, fn);
}