function generate(context, memory, words, edits) {
  var characters = context.flags.TRY
  var characterLength = characters.length
  var data = context.data
  var flags = context.flags
  var result = []
  var upper
  var length
  var index
  var word
  var position
  var count
  var before
  var after
  var nextAfter
  var nextNextAfter
  var character
  var nextCharacter
  var inject
  var offset

  // Check the pre-generated edits.
  length = edits && edits.length
  index = -1

  while (++index < length) {
    check(edits[index], true)
  }

  // Iterate over given word.
  length = words.length
  index = -1

  while (++index < length) {
    word = words[index]

    before = ''
    character = ''
    nextAfter = word
    nextNextAfter = word.slice(1)
    nextCharacter = word.charAt(0)
    position = -1
    count = word.length + 1

    // Iterate over every character (including the end).
    while (++position < count) {
      before += character
      after = nextAfter
      nextAfter = nextNextAfter
      nextNextAfter = nextAfter.slice(1)
      character = nextCharacter
      nextCharacter = word.charAt(position + 1)
      upper = character.toLowerCase() !== character

      // Remove.
      check(before + nextAfter)

      // Switch.
      if (nextAfter) {
        check(before + nextCharacter + character + nextNextAfter)
      }

      // Iterate over all possible letters.
      offset = -1

      while (++offset < characterLength) {
        inject = characters[offset]

        // Add and replace.
        check(before + inject + after)
        check(before + inject + nextAfter)

        // Try upper-case if the original character was upper-cased.
        if (upper) {
          inject = inject.toUpperCase()

          check(before + inject + after)
          check(before + inject + nextAfter)
        }
      }
    }
  }

  // Return the list of generated words.
  return result

  // Check and handle a generated value.
  function check(value, double) {
    var state = memory.state[value]
    var corrected

    if (state !== Boolean(state)) {
      result.push(value)

      corrected = form(context, value)
      state = corrected && !flag(flags, noSuggestType, data[corrected])

      memory.state[value] = state

      if (state) {
        memory.weighted[value] = double ? 10 : 0
        memory.suggestions.push(value)
      }
    }

    if (state) {
      memory.weighted[value]++
    }
  }
}
function generate(context, memory, words, edits) {
  var characters = context.flags.TRY
  var characterLength = characters.length
  var data = context.data
  var flags = context.flags
  var result = []
  var upper
  var length
  var index
  var word
  var position
  var count
  var before
  var after
  var nextAfter
  var nextNextAfter
  var character
  var nextCharacter
  var inject
  var offset

  
  length = edits && edits.length
  index = -1

  while (++index < length) {
    check(edits[index], true)
  }

  
  length = words.length
  index = -1

  while (++index < length) {
    word = words[index]

    before = ''
    character = ''
    nextAfter = word
    nextNextAfter = word.slice(1)
    nextCharacter = word.charAt(0)
    position = -1
    count = word.length + 1

    
    while (++position < count) {
      before += character
      after = nextAfter
      nextAfter = nextNextAfter
      nextNextAfter = nextAfter.slice(1)
      character = nextCharacter
      nextCharacter = word.charAt(position + 1)
      upper = character.toLowerCase() !== character

      
      check(before + nextAfter)

      
      if (nextAfter) {
        check(before + nextCharacter + character + nextNextAfter)
      }

      
      offset = -1

      while (++offset < characterLength) {
        inject = characters[offset]

        
        check(before + inject + after)
        check(before + inject + nextAfter)

        
        if (upper) {
          inject = inject.toUpperCase()

          check(before + inject + after)
          check(before + inject + nextAfter)
        }
      }
    }
  }

  
  return result

  
  function check(value, double) {
    var state = memory.state[value]
    var corrected

    if (state !== Boolean(state)) {
      result.push(value)

      corrected = form(context, value)
      state = corrected && !flag(flags, noSuggestType, data[corrected])

      memory.state[value] = state

      if (state) {
        memory.weighted[value] = double ? 10 : 0
        memory.suggestions.push(value)
      }
    }

    if (state) {
      memory.weighted[value]++
    }
  }
}
function generate ( context , memory , words , edits ) { var characters = context . flags . TRY var characterLength = characters . length var data = context . data var flags = context . flags var result = [ ] var upper var length var index var word var position var count var before var after var nextAfter var nextNextAfter var character var nextCharacter var inject var offset // Check the pre-generated edits. length = edits && edits . length index = - 1 while ( ++ index < length ) { check ( edits [ index ] , true ) } // Iterate over given word. length = words . length index = - 1 while ( ++ index < length ) { word = words [ index ] before = '' character = '' nextAfter = word nextNextAfter = word . slice ( 1 ) nextCharacter = word . charAt ( 0 ) position = - 1 count = word . length + 1 // Iterate over every character (including the end). while ( ++ position < count ) { before += character after = nextAfter nextAfter = nextNextAfter nextNextAfter = nextAfter . slice ( 1 ) character = nextCharacter nextCharacter = word . charAt ( position + 1 ) upper = character . toLowerCase ( ) !== character // Remove. check ( before + nextAfter ) // Switch. if ( nextAfter ) { check ( before + nextCharacter + character + nextNextAfter ) } // Iterate over all possible letters. offset = - 1 while ( ++ offset < characterLength ) { inject = characters [ offset ] // Add and replace. check ( before + inject + after ) check ( before + inject + nextAfter ) // Try upper-case if the original character was upper-cased. if ( upper ) { inject = inject . toUpperCase ( ) check ( before + inject + after ) check ( before + inject + nextAfter ) } } } } // Return the list of generated words. return result // Check and handle a generated value. function check ( value , double ) { var state = memory . state [ value ] var corrected if ( state !== Boolean ( state ) ) { result . push ( value ) corrected = form ( context , value ) state = corrected && ! flag ( flags , noSuggestType , data [ corrected ] ) memory . state [ value ] = state if ( state ) { memory . weighted [ value ] = double ? 10 : 0 memory . suggestions . push ( value ) } } if ( state ) { memory . weighted [ value ] ++ } } }
Get a list of values close in edit distance to `words`.
Get a list of values close in edit distance to words .