intersect method
Returns a VersionConstraint that only allows Versions allowed by both
this and other
.
Implementation
@override
VersionConstraint intersect(VersionConstraint other) {
var ourRanges = ranges.iterator;
var theirRanges = _rangesFor(other).iterator;
// Because both lists of ranges are ordered by minimum version, we can
// safely move through them linearly here.
var newRanges = <VersionRange>[];
var ourRangesMoved = ourRanges.moveNext();
var theirRangesMoved = theirRanges.moveNext();
while (ourRangesMoved && theirRangesMoved) {
var intersection = ourRanges.current.intersect(theirRanges.current);
if (!intersection.isEmpty) newRanges.add(intersection as VersionRange);
// Move the constraint with the lower max value forward. This ensures that
// we keep both lists in sync as much as possible, and that large ranges
// have a chance to match multiple small ranges that they contain.
if (allowsHigher(theirRanges.current, ourRanges.current)) {
ourRangesMoved = ourRanges.moveNext();
} else {
theirRangesMoved = theirRanges.moveNext();
}
}
if (newRanges.isEmpty) return VersionConstraint.empty;
if (newRanges.length == 1) return newRanges.single;
return VersionUnion.fromRanges(newRanges);
}