mergeByteRanges function

List<ByteRange> mergeByteRanges(
  1. Iterable<ByteRange> ranges
)

Sorts ranges and merges overlapping or adjacent non-empty ranges.

Implementation

List<ByteRange> mergeByteRanges(Iterable<ByteRange> ranges) {
  final sorted = ranges.where((range) => !range.isEmpty).toList()..sort();
  if (sorted.isEmpty) return const [];

  final merged = <ByteRange>[];
  var current = sorted.first;
  for (final next in sorted.skip(1)) {
    if (next.start <= current.end) {
      if (next.end > current.end) {
        current = ByteRange(current.start, next.end);
      }
    } else {
      merged.add(current);
      current = next;
    }
  }
  merged.add(current);
  return List.unmodifiable(merged);
}