/** * Allows for easy toggling between resolving promises sequentially vs in parallel */ export async function executePromises Promise>>( promiseFns: T, parallel: boolean, ): Promise<{ [K in keyof T]: Awaited> }> { if (parallel) { // Parallel execution with Promise.all and maintain proper typing return Promise.all(promiseFns.map((promiseFn) => promiseFn())) as Promise<{ [K in keyof T]: Awaited> }> } else { // Sequential execution while maintaining types const results: Awaited>[] = [] for (const promiseFn of promiseFns) { results.push(await promiseFn()) } return results as unknown as Promise<{ [K in keyof T]: Awaited> }> } }