normalizeRanges function

List<(int, int)> normalizeRanges(
  1. List<(int, int)> ranges
)

Normalizes ranges by sorting and merging them.

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

Implementation

List<(int, int)> normalizeRanges(List<(int, int)> ranges) {
  if (ranges.isEmpty) {
    return ranges.toList();
  }

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

  ranges = sortRanges(ranges);
  final result = <(int, int)>[];
  final first = ranges.first;
  result.add(ranges.first);
  var prevStart = first.$1;
  var prevEnd = first.$2;
  for (var i = 1; i < ranges.length; i++) {
    final curr = ranges[i];
    final start = curr.$1;
    final end = curr.$2;
    if (start <= prevEnd + 1) {
      prevEnd = prevEnd > end ? prevEnd : end;
      result[result.length - 1] = (prevStart, prevEnd);
    } else {
      prevStart = start;
      prevEnd = end;
      result.add((start, end));
    }
  }

  return result;
}