blob: e08799275b6378be351fa9753a43fb23e3afdec8 [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++) {
// eslint-disable-next-line no-await-in-loop
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++) {
// eslint-disable-next-line no-await-in-loop
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);
}