private ulong UpdateLeafNode(ulong id, LeafNode node, byte[] value) { if (node.Value.SequenceEqual(value)) { return(id); } else { var newId = NewLeafNode(node.KeyHash, value); return(newId); } }
private ulong SplitLeafNode( ulong id, LeafNode leafNode, int height, IReadOnlyList <byte> keyHash, IEnumerable <byte> value ) { var firstFragment = HashFragment(leafNode.KeyHash, height); var secondFragment = HashFragment(keyHash, height); if (firstFragment != secondFragment) { var secondSon = NewLeafNode(keyHash, value); var secondSonHash = GetNodeById(secondSon)?.Hash; if (secondSonHash is null) { throw new InvalidOperationException(); } var newId = _versionFactory.NewVersion(); _nodeCache[newId] = InternalNode.WithChildren( new[] { id, secondSon }, new[] { firstFragment, secondFragment }, new[] { leafNode.Hash, secondSonHash } ); return(newId); } else { var son = SplitLeafNode(id, leafNode, height + 1, keyHash, value); var sonHash = GetNodeById(son)?.Hash; if (sonHash is null) { throw new InvalidOperationException(); } var newId = _versionFactory.NewVersion(); _nodeCache[newId] = InternalNode.WithChildren(new[] { son }, new[] { firstFragment }, new[] { sonHash }); return(newId); } }