UNPKG

locutus

Version:

Locutus other languages' standard libraries to JavaScript for fun and educational purposes

33 lines (32 loc) 1.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.permutations = permutations; function permutationsInternal(items) { if (items.length === 0) { return [[]]; } const out = []; for (let i = 0; i < items.length; i++) { const current = items[i]; const rest = items.slice(0, i).concat(items.slice(i + 1)); for (const tail of permutationsInternal(rest)) { out.push([current, ...tail]); } } return out; } function permutations(items) { // discuss at: https://locutus.io/haskell/list/permutations/ // original by: Kevin van Zonneveld (https://kvz.io) // note 1: Returns all permutations, preserving Haskell's empty-list behavior (one empty permutation). // example 1: permutations([1, 2, 3]) // returns 1: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] // example 2: permutations(['a', 'b']) // returns 2: [['a', 'b'], ['b', 'a']] // example 3: permutations([]) // returns 3: [[]] if (!Array.isArray(items)) { return [[]]; } return permutationsInternal(items.slice()); }