combine method

List<Interval<T>> combine()

Implementation

List<Interval<T>> combine() {
  final events = <_Event<T>>[];
  for (final interval in intervals) {
    events.add(_Event(interval.start, true, interval.values));
    events.add(_Event(interval.end + 1, false, interval.values));
  }

  events.sort();
  final result = <Interval<T>>[];
  final currentValues = <T>{};
  int? currentStart;
  for (final event in events) {
    if (currentStart != null &&
        event.point > currentStart &&
        currentValues.isNotEmpty) {
      final endPoint = event.point - 1;
      _addOrMerge(
        result,
        Interval<T>(currentStart, endPoint, Set<T>.from(currentValues)),
      );
    }

    if (event.isStart) {
      currentValues.addAll(event.values);
    } else {
      currentValues.removeAll(event.values);
    }

    currentStart = event.point;
  }

  return result;
}