/// <summary> /// Given a continuous set of values, they are marked continuous in this disjointed sorted set. /// But, only if they're all already present. /// </summary> /// <param name="values"></param> internal void JoinRanges(RedisValue[] values) { if (values == null || values.Length <= 1) { return; } lock (_opLockObj) { SortedSet <SortedSetRange> existingRangesToMerge = new SortedSet <SortedSetRange>(new SortedSetRangeScoreComparer()); int valueIndex = 0; bool startedValueMatching = false; foreach (var value in EnumerateValues()) { if (valueIndex >= values.Length) { break; } if (value.Item2.Element == values[valueIndex]) { startedValueMatching = true; existingRangesToMerge.Add(value.Item1); //Store the range valueIndex++; } else { if (startedValueMatching) { //At this point, we've found some values but the range contains extra unexpected ones. return; } } } //If all values were found, merge the ranges. if (startedValueMatching) { SortedSetRange monsterRange = new SortedSetRange(); foreach (var rangeToMerge in existingRangesToMerge) { monsterRange.Add(rangeToMerge); _ranges.Remove(rangeToMerge); } _ranges.Add(monsterRange); //Any markers not at the start or the end should be discarded foreach (var value in monsterRange.Elements.Skip(1).Take(monsterRange.Count - 2)) { if (_markers.Contains(value.Element)) { monsterRange.Remove(value.Element); } } } } }