intersection method
Returns the intersection of this interval and other
.
Implementation
Interval<T> intersection(Interval<T> other) {
if (isEmpty) {
return this;
} else if (other.isEmpty) {
return other;
}
// Find lower bound.
var newLower = lower;
if (lower.isUnbounded) {
newLower = other.lower;
} else if (other.lower.isBounded) {
final cmp = comparator(lower.endpoint, other.lower.endpoint);
if (cmp < 0 || (cmp == 0 && other.lower.isOpen)) {
newLower = other.lower;
}
}
// Find upper bound.
var newUpper = upper;
if (upper.isUnbounded) {
newUpper = other.upper;
} else if (other.upper.isBounded) {
final cmp = comparator(upper.endpoint, other.upper.endpoint);
if (cmp > 0 || (cmp == 0 && other.upper.isOpen)) {
newUpper = other.upper;
}
}
// Swap bounds if necessary.
if (newLower.isBounded && newUpper.isBounded) {
final cmp = comparator(newLower.endpoint, newUpper.endpoint);
if (cmp > 0 || (cmp == 0 && (newLower.isOpen || newUpper.isOpen))) {
return Interval<T>.empty();
} else if (cmp == 0) {
return Interval<T>.single(newLower.endpoint);
}
}
return Interval<T>._(newLower, newUpper, comparator);
}