예제 #1
0
        public PakiraTree AddLeaf(PakiraLeaf leaf)
        {
            this.ShouldBeSameAs(Empty);

            return(new PakiraTree(leaf,
                                  ImmutableDictionary <IPakiraNode, IPakiraNode> .Empty,
                                  ImmutableDictionary <IPakiraNode, IPakiraNode> .Empty,
                                  ImmutableDictionary <IPakiraNode, IPakiraNode> .Empty.Add(leaf, null)));
        }
예제 #2
0
        public PakiraTree AddNode(PakiraNode node, PakiraLeaf leftChildLeaf, PakiraLeaf rightChildLeaf)
        {
            this.ShouldBeSameAs(Empty);
            node.ShouldNotBeNull();
            leftChildLeaf.ShouldNotBeNull();
            rightChildLeaf.ShouldNotBeNull();

            return(new PakiraTree(node,
                                  leftNodes.Add(node, leftChildLeaf),
                                  rightNodes.Add(node, rightChildLeaf),
                                  parentNodes.Add(leftChildLeaf, node).Add(rightChildLeaf, node)));
        }
예제 #3
0
        public PakiraTree ReplaceLeaf(PakiraLeaf leaf, PakiraTree pakiraTree)
        {
            IPakiraNode leafParent = GetParentNode(leaf);

            // The current pakira tree only has a leaf as root
            if (leafParent == null)
            {
                leaf.ShouldBe(Root);

                return(pakiraTree);
            }
            else
            {
                ImmutableDictionary <IPakiraNode, IPakiraNode> updatedLeftNodes;
                ImmutableDictionary <IPakiraNode, IPakiraNode> updatedRightNodes;
                ImmutableDictionary <IPakiraNode, IPakiraNode> updatedParentNodes;

                if (leftNodes.Contains(leafParent, leaf))
                {
                    updatedLeftNodes  = leftNodes.Remove(leafParent);
                    updatedRightNodes = rightNodes;
                    updatedLeftNodes  = updatedLeftNodes.Add(leafParent, pakiraTree.Root);
                }
                else
                {
                    rightNodes.ShouldContainKeyAndValue(leafParent, leaf);

                    updatedLeftNodes  = leftNodes;
                    updatedRightNodes = rightNodes.Remove(leafParent);
                    updatedRightNodes = updatedRightNodes.Add(leafParent, pakiraTree.Root);
                }

                updatedLeftNodes   = updatedLeftNodes.AddRange(pakiraTree.leftNodes);
                updatedRightNodes  = updatedRightNodes.AddRange(pakiraTree.rightNodes);
                updatedParentNodes = parentNodes.Remove(leaf);
                updatedParentNodes = updatedParentNodes.Add(pakiraTree.Root, leafParent);
                updatedParentNodes = updatedParentNodes.AddRange(pakiraTree.parentNodes);

                return(new PakiraTree(Root, updatedLeftNodes, updatedRightNodes, updatedParentNodes));
            }
        }