use std::collections::VecDeque; fn permute(used: &mut Vec, unused: &mut VecDeque, action: &F) { if unused.is_empty() { action(used); } else { for _ in 0..unused.len() { used.push(unused.pop_front().unwrap()); permute(used, unused, action); unused.push_back(used.pop().unwrap()); } } } fn main() { let mut queue = (1..4).collect::>(); permute(&mut Vec::new(), &mut queue, &|perm| println!("{:?}", perm)); }