1use std::collections::BTreeSet;
2
3pub fn all<T>(input: &[T]) -> BTreeSet<BTreeSet<T>>
4where
5    T: Ord + Eq + Clone,
6{
7    let mut permutations = BTreeSet::new();
8
9    if input.is_empty() {
10        return permutations;
11    }
12
13    permutations.insert(input.iter().cloned().collect());
14
15    if input.len() > 1 {
16        for t in input {
17            let p = input
18                .iter()
19                .filter(|pt| *pt != t)
20                .cloned()
21                .collect::<Vec<_>>();
22
23            for pt in all(&p) {
24                permutations.insert(pt);
25            }
26        }
27    }
28
29    permutations
30}
31