/** * Simple implementation of the deferred pattern. * An object that exposes a promise and functions to resolve and reject it. */ export class Deferred { resolve: (value?: T | PromiseLike) => void; reject: (err?: any) => void; promise = new Promise((resolve, reject) => { this.resolve = resolve; this.reject = reject; }); } export async function pSeries(tasks: Iterable<() => Promise | T>): Promise { const results = [] as T[]; for (const task of tasks) { results.push(await task()); } return results; }