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 }));
            }
        }