#!/usr/bin/ruby

func permutations(callback, arr) {
    var end = arr.end;
    var idx = arr.indices;

    loop {
        callback([arr[idx]]);

        var p = end;
        while (idx[p-1] > idx[p]) {p--};
        p == 0 && return();

        var d = p;
        idx += idx.splice(p).reverse;

        while (idx[p-1] > idx[d]) {d++};
        idx[p-1, d] = idx[d, p-1];
    }
}

var list = [1,2,3];
permutations({|set| say set.join }, list);