import { asArray, asIter, chunks, map } from './iterator'; export interface CallbackFunc { (e: Error, r: T); } export type NodeAsyncCall = { (callback: CallbackFunc); } | { (arg1: any, callback: CallbackFunc); } | { (arg1: any, arg2: any, callback: CallbackFunc); } | { (arg1: any, arg2: any, arg3: any, callback: CallbackFunc); } | { (arg1: any, arg2: any, arg3: any, arg4: any, callback: CallbackFunc); } | { (arg1: any, arg2: any, arg3: any, arg4: any, arg5: any, callback: CallbackFunc); } | { (arg1: any, arg2: any, arg3: any, arg4: any, arg5: any, arg6: any, callback: CallbackFunc); } | { (arg1: any, arg2: any, arg3: any, arg4: any, arg5: any, arg6: any, arg7: any, callback: CallbackFunc); } | { (arg1: any, arg2: any, arg3: any, arg4: any, arg5: any, arg6: any, arg7: any, arg8: any, callback: CallbackFunc); } | { (arg1: any, arg2: any, arg3: any, arg4: any, arg5: any, arg6: any, arg7: any, arg8: any, arg9: any, callback: CallbackFunc); }; export async function callbackToPromise(func: NodeAsyncCall, ...args: any[]): Promise { return new Promise((res, rej) => { const callback = (e: Error, ...results: any[]) => { if (e) { rej(e); } else { if (results.length === 0) { res(); } else if (results.length === 1) { res(results[0]); } else { res(results); } } }; func.apply(null, [...args, callback]); }); } export async function whenAll(tasks: U[], mapper: (x: U) => Promise, parallelism: number = 10): Promise { let results = []; for (const chunk of chunks(asIter(tasks), parallelism)) { results = [...results, ...(await Promise.all(asArray(map(chunk, mapper))))]; } return results; }