示例#1
0
        public Tuple <IImmutableTree <TKey, TValue>, bool, TValue> TryRemove(TKey key)
        {
            IImmutableTree <TKey, TValue> result;
            var    comparison = _comparer.Compare(key, _key);
            bool   removed;
            TValue val;

            if (0 == comparison)
            {
                removed = true;
                val     = _value;

                if (Right.IsEmpty && Left.IsEmpty)
                {
                    result = new ImmutableTreeAcorn <TKey, TValue>(_comparer, _keyCloner, _valueCloner);
                }
                else if (Right.IsEmpty && !Left.IsEmpty)
                {
                    result = Left;
                }
                else if (!Right.IsEmpty && Left.IsEmpty)
                {
                    result = Right;
                }
                else
                {
                    var s = Right;
                    while (!s.Left.IsEmpty)
                    {
                        s = s.Left;
                    }
                    result = new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, s.RootKey, s.RootValue, Left,
                                                              Right.TryRemove(s.RootKey).Item1);
                }
            }
            else if (comparison < 0)
            {
                var removal = Left.TryRemove(key);
                removed = removal.Item2;
                val     = removal.Item3;
                result  = new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, _key, _value, removal.Item1,
                                                           Right);
            }
            else
            {
                var removal = Right.TryRemove(key);
                removed = removal.Item2;
                val     = removal.Item3;
                result  = new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, _key, _value, Left,
                                                           removal.Item1);
            }

            var br = BalanceTree(result);

            return(Tuple.Create(br, removed, val));
        }
示例#2
0
        private IImmutableTree <TKey, TValue> RotateRightRight(IImmutableTree <TKey, TValue> tree)
        {
            if (tree.Left.IsEmpty)
            {
                return(tree);
            }
            var rotatedLeftChild = new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, tree.RootKey,
                                                                    tree.RootValue, RotateLeft(tree.Left), tree.Right);

            return(RotateRight(rotatedLeftChild));
        }
示例#3
0
        public IImmutableTree <TKey, TValue> Add(TKey key, TValue value)
        {
            var comparison = _comparer.Compare(key, _key);

            if (0 == comparison)
            {
                return(new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, key, value, Left, Right));
            }

            ImmutableTree <TKey, TValue> result = comparison > 0
                                               ? new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, _key,
                                                                                  _value, Left, Right.Add(key, value))
                                               : new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, _key,
                                                                                  _value, Left.Add(key, value), Right);

            return(BalanceTree(result));
        }
示例#4
0
        public IImmutableTree <TKey, TValue> AddOrUpdate(TKey key, TValue value, Func <TKey, TValue, TValue> updateValueFactory)
        {
            ImmutableTree <TKey, TValue> result;
            var comparison = _comparer.Compare(key, _key);

            if (comparison > 0)
            {
                result = new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, _key, _value, Left,
                                                          Right.AddOrUpdate(key, value, updateValueFactory));
            }
            else if (comparison < 0)
            {
                result = new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, _key, _value,
                                                          Left.AddOrUpdate(key, value, updateValueFactory), Right);
            }
            else
            {
                result = new ImmutableTree <TKey, TValue>(_comparer, _keyCloner, _valueCloner, key,
                                                          updateValueFactory(key, _value), Left, Right);
            }

            return(BalanceTree(result));
        }