difference method
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();
}