public static ISettingsNode Extract([NotNull] ClusterConfigClientState state, ClusterConfigPath path, [CanBeNull] SettingsMergeOptions mergeOptions)
        {
            mergeOptions = mergeOptions ?? DefaultMergeOptions;

            return(state.Cache.Obtain(
                       path,
                       p =>
            {
                foreach (var prefix in EnumeratePrefixes(p))
                {
                    if (state.Cache.TryGetValue(prefix, out var tree))
                    {
                        return tree.ScopeTo(path.Segments.Skip(prefix.Segments.Count()));
                    }
                }

                var remoteSettings = state.RemoteTree?.GetSettings(p);
                var localSettings = state.LocalTree?.ScopeTo(p.Segments);

                return SettingsNodeMerger.Merge(remoteSettings, localSettings, mergeOptions);
            }));
        }
        public void TestSetup()
        {
            localTree = new ObjectNode(null, new ISettingsNode[]
            {
                new ObjectNode("foo", new ISettingsNode[]
                {
                    new ObjectNode("baz", new ISettingsNode[]
                    {
                        new ValueNode("key1", "value1"),
                        new ValueNode("key2", "value2")
                    }),
                    new ValueNode("key3", "value3")
                }),
                new ObjectNode("bar", new ISettingsNode[]
                {
                    new ValueNode("key4", "value4")
                })
            });

            remoteTree = new ObjectNode(null, new ISettingsNode[]
            {
                new ObjectNode("foo", new ISettingsNode[]
                {
                    new ObjectNode("baz", new ISettingsNode[]
                    {
                        new ValueNode("key5", "value5"),
                        new ValueNode("key6", "value6")
                    }),
                    new ValueNode("key3", "value7")
                }),
                new ArrayNode("bar", new ISettingsNode[]
                {
                    new ValueNode("0", "value8")
                })
            });

            state = null;
        }
        private ISettingsNode Extract(ClusterConfigPath path)
        {
            if (state == null)
            {
                RemoteTree remote;

                if (remoteTree == null)
                {
                    remote = null;
                }
                else
                {
                    var writer = new BinaryBufferWriter(64);

                    TreeSerializers.V1.Serialize(remoteTree, writer);

                    remote = new RemoteTree(writer.Buffer.Take(writer.Length).ToArray(), TreeSerializers.V1);
                }

                state = new ClusterConfigClientState(localTree, remote, new RecyclingBoundedCache <ClusterConfigPath, ISettingsNode>(10), Int64.MaxValue);
            }

            return(TreeExtractor.Extract(state, path, null));
        }