intersection method

Interval<T> intersection(
  1. Interval<T> other
)

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);
}