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