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