• Jump To … +
    dawg.coffee max-heap.coffee index.coffee builder.coffee distance.coffee transducer.coffee mutate.coffee operations.coffee permutations.coffee truth-table.coffee
  • permutations.coffee

  • ¶
    concat = (lists...) ->
      concatenation = []
      for list in lists
        concatenation = concatenation.concat(list)
      concatenation
    
    expand = (element, lists) ->
      list.unshift(element) for list in lists
      lists
    
    swap = (list, i, j) ->
      t = list[i]
      list[i] = list[j]
      list[j] = t
      list
    
    permutations = (list, i) ->
      switch list.length - i
        when 0
          []
        when 1
          [[list[i]]]
        when 2
          [
            [list[i], list[i + 1]]
            [list[i + 1], list[i]]
          ]
        else
          p = []
          offset = list.length - i
          for j in [0...offset]
            l = list.slice()
            swap(l, i, i + j)
            p.push(expand(l[i], permutations(l, i + 1)))
          concat.apply(null, p)
    
    global =
      if typeof exports is 'object'
        exports
      else if typeof window is 'object'
        window
      else
        this
    
    global['levenshtein'] ||= {}
    global['levenshtein']['permutations'] = (list) -> permutations(list, 0)