Dart bounded worker pool with results
Dart
import 'dart:async';
Future<List<Object>> runPool<T>(List<Future<T> Function()> tasks, int workers) async {
if (workers < 1) throw ArgumentError.value(workers, 'workers', 'must be >= 1');
final results = List<Object?>.filled(tasks.length, null);
var next = 0;
Future<void> worker() async {
while (true) {
final i = next++;
if (i >= tasks.length) return;
try {
results[i] = await tasks[i]();
} catch (e) {
results[i] = e;
}
}
}
final n = workers < tasks.length ? workers : tasks.length;
await Future.wait(List.generate(n, (_) => worker()));
return results.cast<Object>();
}