use std::iter::once;
use mpt_trie::partial_trie::PartialTrie;
use mpt_trie::utils::TryFromIterator;
use mpt_trie::{
nibbles::{Nibbles, ToNibbles},
partial_trie::{HashedPartialTrie, StandardTrie},
trie_ops::{TrieOpResult, ValOrHash},
};
fn main() -> TrieOpResult<()> {
let mut trie = StandardTrie::default();
trie.insert(
Nibbles::from_bytes_be(b"hello").unwrap(),
b"world!".to_vec(),
)?;
let mut trie = StandardTrie::try_from_iter(vec![
(0x1234_u32, b"some data".to_vec()),
(9001_u32, vec![1, 2, 3]),
])?;
assert_eq!(trie.get(0x1234_u32), Some(b"some data".as_slice()));
assert_eq!(trie.get(0x5678_u32), None);
let _hash = trie.hash();
assert_eq!(
trie.items().collect::<Vec<_>>(),
vec![
(0x1234_u32.into(), ValOrHash::Val(b"some data".to_vec())),
(9001_u32.into(), ValOrHash::Val(vec![1, 2, 3]))
]
);
let del_val = trie.delete(0x1234_u32)?;
assert_eq!(del_val.unwrap(), b"some data".to_vec());
assert_eq!(trie.get(0x1234_u32), None);
let hash_1 = HashedPartialTrie::try_from_iter(once((
0x19002_u32.to_nibbles_byte_padded(),
vec![4, 5, 6],
)))?
.hash();
let hash_2 =
HashedPartialTrie::try_from_iter(once((0x19002_u32.to_nibbles(), vec![4, 5, 6])))?.hash();
assert_ne!(hash_1, hash_2);
assert_eq!(
format!("{:x}", Nibbles::from_bytes_be(&[1, 35, 69]).unwrap()),
"0x012345"
);
assert_eq!(
format!("{:x}", Nibbles::from_bytes_le(&[69, 35, 1]).unwrap()),
"0x012345"
);
Ok(())
}