Example #1
0
        private void UpdateSortedValues(EnhancedSortedSet <TValue> bucket, TValue?previousLast)
        {
            TValue?newLast = bucket.Max;

            if (!Equals(previousLast, newLast))
            {
                if (previousLast is not null)
                {
                    _worstSortedValues.Remove(previousLast);
                }

                _worstSortedValues.Add(newLast, GetKey(newLast));
            }
        }
Example #2
0
        /// <summary>
        /// Actual insert mechanism.
        /// </summary>
        protected virtual void InsertCore(TKey key, TValue value, TGroupKey groupKey)
        {
            if (!_buckets.TryGetValue(groupKey, out EnhancedSortedSet <TValue> bucket))
            {
                _buckets[groupKey] = bucket = new EnhancedSortedSet <TValue>(_groupComparer);
            }

            TValue?last = bucket.Max;

            if (bucket.Add(value))
            {
                _cacheMap[key] = value;
                UpdateSortedValues(bucket, last);
                Inserted?.Invoke(this, new SortedPoolEventArgs(key, value, groupKey));
            }
        }
Example #3
0
        public IEnumerable <TValue> TakeWhile(TGroupKey groupKey, Predicate <TValue> where)
        {
            if (_buckets.TryGetValue(groupKey, out EnhancedSortedSet <TValue>?bucket))
            {
                using EnhancedSortedSet <TValue> .Enumerator enumerator = bucket !.GetEnumerator();
                List <TValue>?list = null;

                while (enumerator.MoveNext())
                {
                    if (!where (enumerator.Current))
                    {
                        break;
                    }

                    list ??= new List <TValue>();
                    list.Add(enumerator.Current);
                }

                return(list ?? Enumerable.Empty <TValue>());
            }
            return(Enumerable.Empty <TValue>());
        }