28 lines
671 B
TypeScript
28 lines
671 B
TypeScript
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;
|
||
|
|
};
|