1use std::{array::from_fn, fmt, ops::BitXor};
2
3use vec_entries::EntriesExt;
4
5struct DebugVec<'a, T>(&'a Vec<T>);
6
7impl<'a, T: fmt::Binary> fmt::Binary for DebugVec<'a, T> {
8 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9 for (count, n) in self.0.iter().enumerate() {
10 if count != 0 {
11 write!(f, " ")?;
12 }
13 n.fmt(f)?;
14 }
15
16 Ok(())
17 }
18}
19
20fn merkle_step<T>(v: &mut Vec<T>, mut join: impl FnMut(T, T) -> T) {
21 v.entries(.., |e| {
22 while let Some(left) = e.remove() {
23 let Some(right) = e.remove() else {
24 let Ok(_) = e.try_insert_outside(left) else {
26 unreachable!()
27 };
28 return;
29 };
30
31 let joined = join(left, right);
33 let Ok(_) = e.try_insert_outside(joined) else {
34 unreachable!()
35 };
36 }
37 });
38}
39
40fn main() {
41 let v: [u64; 9] = from_fn(|i| 1 << i);
42 let mut v: Vec<_> = v.into();
43
44 println!("{:09b}", DebugVec(&v));
45 merkle_step(&mut v, BitXor::bitxor);
46 println!("{:09b}", DebugVec(&v));
47 merkle_step(&mut v, BitXor::bitxor);
48 println!("{:09b}", DebugVec(&v));
49 merkle_step(&mut v, BitXor::bitxor);
50 println!("{:09b}", DebugVec(&v));
51 merkle_step(&mut v, BitXor::bitxor);
52 println!("{:09b}", DebugVec(&v));
53 merkle_step(&mut v, BitXor::bitxor);
54 println!("{:09b}", DebugVec(&v));
55 merkle_step(&mut v, BitXor::bitxor);
56 println!("{:09b}", DebugVec(&v));
57}