PackageVersionNumberGeneralLibraryConstraint.unionOf constructor

PackageVersionNumberGeneralLibraryConstraint.unionOf(
  1. Iterable<PackageVersionNumberGeneralLibraryConstraint> constraints
)

Creates a new version constraint that is the union of constraints.

It allows any versions that any of those constraints allows. If constraints is empty, this returns a constraint that allows no versions.

Implementation

factory PackageVersionNumberGeneralLibraryConstraint.unionOf(
    Iterable<PackageVersionNumberGeneralLibraryConstraint> constraints) {
  var flattened = constraints.expand((constraint) {
    if (constraint.isEmpty) {
      return <PackageVersionNumberGeneralLibraryRange>[];
    }
    if (constraint is PackageVersionNumberGeneralLibraryUnion) {
      return constraint.ranges;
    }
    if (constraint is PackageVersionNumberGeneralLibraryRange) {
      return [constraint];
    }
    throw ArgumentError(
        'Unknown PackageVersionNumberGeneralLibraryConstraint type $constraint.');
  }).toList();

  if (flattened.isEmpty) {
    return PackageVersionNumberGeneralLibraryConstraint.empty;
  }

  if (flattened.any((constraint) => constraint.isAny)) {
    return PackageVersionNumberGeneralLibraryConstraint.any;
  }

  flattened.sort();

  var merged = <PackageVersionNumberGeneralLibraryRange>[];
  for (var constraint in flattened) {
    // Merge this constraint with the previous one, but only if they touch.
    if (merged.isEmpty ||
        (!merged.last.allowsAny(constraint) &&
            !areAdjacent(merged.last, constraint))) {
      merged.add(constraint);
    } else {
      merged[merged.length - 1] = merged.last.union(constraint)
          as PackageVersionNumberGeneralLibraryRange;
    }
  }

  if (merged.length == 1) return merged.single;
  return PackageVersionNumberGeneralLibraryUnion.fromRanges(merged);
}