// compile-flags: -Zinline-mir use std::fmt::Display; fn main() { permutations(&['a', 'b', 'c']); } #[inline(always)] fn permutations(xs: &[T]) { let mut ys = xs.to_owned(); permutate(&mut ys, 0); } fn permutate(xs: &mut [T], k: usize) { let n = length(xs); if k == n { display(xs); } else if k < n { for i in k..n { swap(xs, i, k); permutate(xs, k + 1); swap(xs, i, k); } } else { error(); } } fn length(xs: &[T]) -> usize { xs.len() } #[inline] fn swap(xs: &mut [T], i: usize, j: usize) { let t = xs[i]; xs[i] = xs[j]; xs[j] = t; } fn display(xs: &[T]) { for x in xs { print!("{}", x); } println!(); } #[inline(always)] fn error() { panic!("error"); }