readMany method

Future<List<int>> readMany(
  1. List<ReadRequest> requests, {
  2. CancelToken? cancel,
})

Implementation

Future<List<int>> readMany(
  List<ReadRequest> requests, {
  CancelToken? cancel,
}) async {
  cancel?.throwIfCancelled(path: path);
  if (requests.length > 1) {
    final merged = _tryMergeReadContiguous(requests);
    if (merged != null) {
      final bytes = Uint8List(merged.total);
      final n = await readAt(merged.offset, ReadBuf(bytes), cancel: cancel);
      final out = <int>[];
      var base = 0;
      for (final request in requests) {
        final want = request.dst.remaining;
        final available = (n - base).clamp(0, want);
        if (available > 0) {
          request.dst.unfilled.setRange(0, available, bytes, base);
          request.dst.advance(available);
        }
        out.add(available);
        base += want;
      }
      return out;
    }
    if (_backend.supportsConcurrentReads) {
      return Future.wait([
        for (final request in requests)
          readAt(request.offset, request.dst, cancel: cancel),
      ]);
    }
  }
  final out = <int>[];
  for (final request in requests) {
    out.add(await readAt(request.offset, request.dst, cancel: cancel));
  }
  return out;
}