private void AddOrSetImpl(ReadOnlySpan <string> keys, object?data)
        {
            string key = keys[0];

            if (keys.Length >= 2)
            {
                TreeModify childModify;
                if (ModifyDescriptor.TryGetValue(key, out var oldValue))
                {
                    if (oldValue is TreeModify modify)
                    {
                        childModify = modify;
                    }
                    else
                    {
                        throw new AlreadyExitsError(key);
                    }
                }
                else
                {
                    childModify           = new TreeModify();
                    ModifyDescriptor[key] = childModify;
                }

                try
                {
                    childModify.AddOrSetImpl(keys.Slice(1), data);
                }
                catch (AlreadyExitsError e)
                {
                    throw new AlreadyExitsError($"{e.Message}.{key}");
                }
            }
            else
            {
                if (ModifyDescriptor.ContainsKey(key))
                {
                    throw new AlreadyExitsError($"{key} is already exists");
                }
                ModifyDescriptor[key] = data;
            }
        }
 public void AddOrSet(string key, TreeModify tree)
 {
     AddOrSetImpl(key, tree);
 }