intersect method

Returns a PackageVersionNumberGeneralLibraryConstraint that only allows PackageVersionNumberGeneralLibrarys allowed by both this and other.

Implementation

@override
PackageVersionNumberGeneralLibraryConstraint intersect(
    PackageVersionNumberGeneralLibraryConstraint 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 = <PackageVersionNumberGeneralLibraryRange>[];
  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 PackageVersionNumberGeneralLibraryRange);
    }

    // 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 PackageVersionNumberGeneralLibraryConstraint.empty;
  }
  if (newRanges.length == 1) return newRanges.single;

  return PackageVersionNumberGeneralLibraryUnion.fromRanges(newRanges);
}