1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

pub fn root<L,H>(leaves: &[&L]) -> H

    where
    
        L: Into<H> + Clone,

        H: Into<Vec<u8>> + From<Vec<u8>> + From<L> + Clone

            {

                if leaves.is_empty() {

                    vec![].into()

                } else {

                    let mut hashes: Vec<H> = leaves
                        .iter()
                        .map(|&x| x.clone().into())
                        .collect();
                    
                    while hashes.len() > 1 {

                        let mut next = vec![];

                        let mut intermediate = vec![];

                        for h in hashes {
                            
                            intermediate.push(h);
                            
                            if intermediate.len() == 2 {

                                let join = intermediate
                                    .iter()
                                    .fold(
                                        vec![], |acc, x| {

                                            let x_bytes: Vec<u8> = x.clone().into();
                                            
                                            [acc, x_bytes].concat()
                                        }
                                    );

                                let join_hash: H = join.into();
                                    
                                next.push(join_hash);

                                intermediate.clear()

                            }

                        }

                        if !intermediate.is_empty() {
                            next.push(intermediate[0].clone());
                        }

                        hashes = next
                        
                    }

                    hashes[0].clone()

                }

}