Permutate String

'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 }