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>();
}