var val = [0, 1, 2, 3]
var map = new Map();
map.set(val.join('|'), true)
var gen = [val];
var nextGen = null;
var iter = 0;
while (gen.length) {
nextGen = [];
for (var i = 0; i < gen.length; i++) {
var original = gen[i]
for (var j = 0; j < original.length - 1; j++) {
var newI = original.slice(0);
[newI[j], newI[j+1]] = [newI[j+1], newI[j]];
if (map.has(newI.join('|'))) {
continue;
}
map.set(newI.join('|'), true);
nextGen.push(newI)
}
}
console.log(nextGen);
gen = nextGen;
iter++;
}
console.log(iter - 1, Array.from(map))