module Boggler::Dictionary

Public Instance Methods

words() click to toggle source
# File lib/boggler/dictionary.rb, line 5
def words
  return @words if defined?(@words)

  content = nil

  Benchmarking.measure('dictionary') do
    path = File.expand_path('../../../vendor/dictionary.txt', __FILE__)
    content = File.read(path)
    content = content.split("\n")
    @words = words_to_hash(content)
  end

  @words
end
words_to_hash(words) click to toggle source
# File lib/boggler/dictionary.rb, line 20
def words_to_hash(words)
  hash = {}

  words.each do |word|
    word = word.split('')

    key = word[0..2].join
    letters = word[3..-1]

    merge_word hash, key, word_to_hash(letters)
  end

  hash
end

Private Instance Methods

letters_to_hash(hash = {}, letters = []) click to toggle source
# File lib/boggler/dictionary.rb, line 63
def letters_to_hash(hash = {}, letters = [])
  hash ||= {}
  letters.each_with_index do |letter, i|
    if letters.length > 1
      hash[letter] = letters_to_hash(hash[letter], letters[(i + 1)..-1])
      return hash
    else
      hash[letter] = {'' => true}
      return hash
    end
  end
end
merge_word(hash, key, word_hash) click to toggle source
# File lib/boggler/dictionary.rb, line 37
def merge_word(hash, key, word_hash)
  if hash[key]
    merge_word_hash hash[key], word_hash
  else
    hash[key] = word_hash
  end
end
merge_word_hash(hash, word_hash) click to toggle source
# File lib/boggler/dictionary.rb, line 45
def merge_word_hash(hash, word_hash)
  hash.merge!(word_hash) do |key, old_value, new_value|
    if old_value.is_a?(Hash) && new_value.is_a?(Hash)
      merge_word_hash(old_value, new_value)
    else
      old_value || new_value
    end
  end
end
word_to_hash(letters) click to toggle source
# File lib/boggler/dictionary.rb, line 55
def word_to_hash(letters)
  if letters.empty?
    {'' => true}
  else
    letters_to_hash({}, letters)
  end
end