module TreeSpell # Changes a word with one of four actions: # insertion, substitution, deletion and transposition. class ChangeWord # initialize with input string def initialize(input) @input = input @len = input.length end # insert char after index of i_place def insertion(i_place, char) @word = input.dup return char + word if i_place == 0 return word + char if i_place == len - 1 word.insert(i_place + 1, char) end # substitute char at index of i_place def substitution(i_place, char) @word = input.dup word[i_place] = char word end # delete character at index of i_place def deletion(i_place) @word = input.dup word.slice!(i_place) word end # transpose char at i_place with char at i_place + direction # if i_place + direction is out of bounds just swap in other direction def transposition(i_place, direction) @word = input.dup w = word.dup return swap_first_two(w) if i_place + direction < 0 return swap_last_two(w) if i_place + direction >= len swap_two(w, i_place, direction) w end private attr_accessor :word, :input, :len def swap_first_two(w) w[1] + w[0] + word[2..-1] end def swap_last_two(w) w[0...(len - 2)] + word[len - 1] + word[len - 2] end def swap_two(w, i_place, direction) w[i_place] = word[i_place + direction] w[i_place + direction] = word[i_place] end end end