PackageVersionNumberGeneralLibraryConstraint.unionOf constructor
PackageVersionNumberGeneralLibraryConstraint.unionOf(
- 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);
}