private VersionRange NeededRange(VersionRange alreadySearched, VersionRange possibleSubSet) { if (alreadySearched == null || _versionRangeComparer.Equals(alreadySearched, EmptyRange)) { return(possibleSubSet); } if (_versionRangeComparer.Equals(possibleSubSet, EmptyRange)) { return(EmptyRange); } // full overlap scenarios if (possibleSubSet.IsSubSetOrEqualTo(alreadySearched)) { return(EmptyRange); } else if (possibleSubSet.IsSubSetOrEqualTo(alreadySearched)) { return(possibleSubSet); } // we need a partial range // [ ] // [ ] if (possibleSubSet.HasLowerBound && alreadySearched.Satisfies(possibleSubSet.MinVersion)) { // already searched the lower set return(new VersionRange(possibleSubSet.MinVersion, possibleSubSet.IsMinInclusive, alreadySearched.MaxVersion, alreadySearched.IsMaxInclusive, possibleSubSet.IncludePrerelease || alreadySearched.IncludePrerelease)); } else if (possibleSubSet.HasUpperBound && alreadySearched.Satisfies(possibleSubSet.MaxVersion)) { // already searched the higher set return(new VersionRange(alreadySearched.MinVersion, alreadySearched.IsMinInclusive, possibleSubSet.MaxVersion, possibleSubSet.IsMaxInclusive, possibleSubSet.IncludePrerelease || alreadySearched.IncludePrerelease)); } else { // TODO: improve this return(VersionRange.Combine(new VersionRange[] { alreadySearched, possibleSubSet })); } }