difference method

Range<T> difference(
  1. Range<T> range
)

result of range difference would not be contiguous

Implementation

Range<T> difference(Range<T> range) {
  if (empty) {
    return _createEmptyRange();
  }
  if (range.empty) {
    return this;
  }

  if (strictlyRightOf(range) || strictlyLeftOf(range)) {
    return this;
  }

  if (range.contains(this)) {
    return _createEmptyRange();
  }

  if (contains(range)) {
    if (_isNotBoundsEqual(lowerBound, range.lowerBound) &&
        _isNotBoundsEqual(upperBound, range.upperBound)) {
      throw ContiguousRangeException();
    }

    if (_isBoundsEqual(lowerBound, range.lowerBound)) {
      final _lowerBound = range.upperBound.invert();
      final _upperBound = upperBound;
      return createRange(lowerBound: _lowerBound, upperBound: _upperBound);
    }

    if (_isBoundsEqual(upperBound, range.upperBound)) {
      final _lowerBound = lowerBound;
      final _upperBound = range.lowerBound.invert();
      return createRange(lowerBound: _lowerBound, upperBound: _upperBound);
    }
  }

  if (_compareBounds(upperBound, range.upperBound) >= 0) {
    final _lowerBound = range.upperBound.invert();
    final _upperBound = upperBound;
    return createRange(lowerBound: _lowerBound, upperBound: _upperBound);
  } else if (_compareBounds(range.lowerBound, lowerBound) >= 0) {
    final _lowerBound = lowerBound;
    final _upperBound = range.lowerBound.invert();
    return createRange(lowerBound: _lowerBound, upperBound: _upperBound);
  }

  throw NonExistentCaseRangeException();
}