'use strict' const permutate = (aString) => { if (typeof aString !== 'string' || !aString) { throw new Error('The arg must be a valid, non empty string') } const characters = aString.split('') let permutations = [[characters.shift()]] while (characters.length) { const currentCharacter = characters.shift() permutations = calculateCurrentCharacterPermutation(permutations, currentCharacter) } return permutations .map(character => character.join('')) .filter((item, index, self) => (self.indexOf(item) === index)) .sort() } const calculateCurrentCharacterPermutation = (allPermutations, currentCharacter) => { const currentPermutations = [] allPermutations.forEach(permutation => { let index = 0 while (index <= permutation.length) { const tmp = [...permutation] tmp.splice(index, 0, currentCharacter) currentPermutations.push(tmp) index++ } }) return currentPermutations } export { permutate }