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
pub trait VecUtils<T> {
    fn power_set(&self) -> Vec<Vec<T>>;
}

impl<T> VecUtils<T> for Vec<T>
where
    T: Clone,
{
    fn power_set(&self) -> Vec<Vec<T>> {
        let n = self.len();
        (0..1 << n)
            .map(|pattern| {
                (0..n)
                    .filter_map(|i| {
                        if (pattern >> i) & 1 == 1 {
                            Some(self[i].clone())
                        } else {
                            None
                        }
                    })
                    .collect::<Vec<T>>()
            })
            .collect()
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn vec_test() {
        let mut test = vec![0, 1, 2];

        assert_eq!(
            vec![
                vec![],
                vec![0],
                vec![1],
                vec![0, 1],
                vec![2],
                vec![0, 2],
                vec![1, 2],
                vec![0, 1, 2]
            ],
            test.power_set()
        );

        test.push(3);
        test.push(4);

        assert_eq!(test.power_set().len(), 32);
    }
}