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