/// <summary>
        /// Try to remove the key, and return the resulting Dict
        /// if the key is not found, old_node is Empty, else old_node is the Dict
        /// with matching Key
        /// </summary>
        public AvlNode <T> RemoveFromNew(int index, out bool found)
        {
            if (IsEmpty)
            {
                found = false;
                return(Empty);
            }

            if (index < _left._count)
            {
                var newLt = _left.RemoveFromNew(index, out found);
                if (!found)
                {
                    //Not found, so nothing changed
                    return(this);
                }
                var newRoot = NewOrMutate(Value, newLt, _right);
                return(newRoot.FixRootBalance());
            }

            if (index > _left._count)
            {
                var newGt = _right.RemoveFromNew(index - _left._count - 1, out found);
                if (!found)
                {
                    //Not found, so nothing changed
                    return(this);
                }
                var newRoot = NewOrMutate(Value, _left, newGt);
                return(newRoot.FixRootBalance());
            }

            //found it
            found = true;
            return(RemoveRoot());
        }