combine method
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;
}