normalizeRanges function

Ranges normalizeRanges(
  1. Ranges ranges
)

Normalizes ranges by sorting and merging overlapping or adjacent ones.

Returns a new list with the merged values sorted in ascending range order.

Implementation

Ranges normalizeRanges(Ranges ranges) {
  if (ranges.isEmpty) {
    return [];
  }

  // Validate range correctness
  for (var i = 0; i < ranges.length; i++) {
    if (ranges[i].$1 > ranges[i].$2) {
      throw ArgumentError(
        'Invalid range at index $i: (${ranges[i].$1}, ${ranges[i].$2})',
      );
    }
  }

  final sorted = sortRanges(ranges);
  final result = <Range>[sorted.first];
  for (var i = 1; i < sorted.length; i++) {
    final current = sorted[i];
    final last = result.last;
    // If current range overlaps or is adjacent to the last merged range
    if (current.$1 <= last.$2 + 1) {
      result[result.length - 1] = (last.$1, max(last.$2, current.$2));
    } else {
      result.add(current);
    }
  }

  return result;
}