1 | 'use strict';
|
2 | function concat$(x, ...ys) {
|
3 | for (var y of ys)
|
4 | x.push(...y);
|
5 | return x;
|
6 | }
|
7 | function splice(x, i, n = x.length - i, ...vs) {
|
8 | return concat$(x.slice(0, i), vs, x.slice(i + n));
|
9 | }
|
10 | function* permutationsOf(x, n) {
|
11 | var X = x.length;
|
12 | if (X === 0 || n === 0) {
|
13 | yield [];
|
14 | return;
|
15 | }
|
16 | for (var i = 0; i < X; i++) {
|
17 | var y = splice(x, i, 1);
|
18 | for (var p of permutationsOf(y, n - 1))
|
19 | yield [x[i], ...p];
|
20 | }
|
21 | }
|
22 | function* permutations(x, n = -1) {
|
23 | var X = x.length;
|
24 | if (n > X)
|
25 | return;
|
26 | for (var i = n < 0 ? 0 : n, I = n < 0 ? X : n; i <= I; i++)
|
27 | yield* permutationsOf(x, i);
|
28 | }
|
29 | module.exports = permutations;
|