#!/usr/bin/ruby
func permutations(callback, set, perm=[]) {
set.is_empty && callback(perm);
set.range.each { |i|
__FUNC__(callback, [set[(0 ..^ i)..., (i+1 ..^ set.len)...]], [perm..., set[i]]);
}
};
var list = [1,2,3];
permutations({|set| say set.join}, list);