Add concurrencyLimit to parallelMap

This commit is contained in:
Andrew Morris
2022-05-01 17:58:36 +10:00
parent ebd7bf49fe
commit ac295889f5

View File

@@ -3,8 +3,23 @@ import { thread } from 'value-script';
export default function parallelMap<Value, MappedValue>(
values: Value[],
mapper: (value: Value) => MappedValue,
concurrencyLimit = 10,
) {
return values
.map(v => thread(() => mapper(v)))
.map(t => t());
let poolSize = Math.min(values.length, concurrencyLimit);
const pool = values
.slice(0, poolSize)
.map(v => thread(() => mapper(v)));
let results: MappedValue[] = [];
for (let i = 0; i < values.length; i++) {
results[i] = pool[i % poolSize]();
if (i + poolSize < values.length) {
pool[i % poolSize] = thread(() => mapper(values[i + poolSize]));
}
}
return results;
}