Esempio n. 1
0
 public override INode AddOrUpdate(OneItemLeaf item)
 {
     if (item.Hash < LeftItem.Hash)
     {
         var newLeft = Left.AddOrUpdate(item);
         return(!IsEmerged(newLeft, Left)
             ? new TwoItemsTree(LeftItem, RightItem, newLeft, Middle, Right)
             : (INode) new OneItemTree(LeftItem, newLeft, new OneItemTree(RightItem, Middle, Right)));
     }
     // if (item.Hash == LeftItem.Hash)
     if (item.Hash < RightItem.Hash)
     {
         var newMiddle = Middle.AddOrUpdate(item);
         if (!IsEmerged(newMiddle, Middle))
         {
             return(new TwoItemsTree(LeftItem, RightItem, Left, newMiddle, Right));
         }
         var emergedMiddle = (OneItemTree)newMiddle;
         return(new OneItemTree(emergedMiddle.Item,
                                new OneItemTree(LeftItem, Left, emergedMiddle.Right),
                                new OneItemTree(RightItem, emergedMiddle.Left, Right)));
     }
     // for now skip if (item.Hash == RightItem.Hash)
     // else if (item.Hash > RightItem.Hash)
     {
         var newRight = Right.AddOrUpdate(item);
         return(!IsEmerged(newRight, Right)
             ? new TwoItemsTree(LeftItem, RightItem, Left, Middle, newRight)
             : (INode) new OneItemTree(RightItem, new OneItemTree(LeftItem, Left, Middle), newRight));
     }
 }