Files
openchamber/packages/ui/src/lib/concurrency.ts
T

28 lines
671 B
TypeScript
Raw Normal View History

export const mapWithConcurrency = async <T, R>(
values: T[],
concurrency: number,
mapper: (value: T) => Promise<R>,
): Promise<R[]> => {
if (values.length === 0) {
return [];
}
const safeConcurrency = Math.max(1, Math.min(concurrency, values.length));
const results = new Array<R>(values.length);
let cursor = 0;
const worker = async () => {
while (true) {
const nextIndex = cursor;
cursor += 1;
if (nextIndex >= values.length) {
return;
}
results[nextIndex] = await mapper(values[nextIndex]);
}
};
await Promise.all(Array.from({ length: safeConcurrency }, () => worker()));
return results;
};