class Wordz::Generator

Constants

ROOT_NODE

Attributes

grammar[R]
output[R]
subjects[R]

Public Class Methods

new(grammar: {}, subjects: {}) click to toggle source
# File lib/wordz/generator.rb, line 11
def initialize(grammar: {}, subjects: {})
  @output = []
  @subjects = subjects
  @grammar = grammar
end

Public Instance Methods

call(root_node = nil) click to toggle source
# File lib/wordz/generator.rb, line 17
def call(root_node = nil)
  root_node ||= ROOT_NODE
  post_process(generate_list(root_node))
end

Private Instance Methods

build_instruction(str) click to toggle source
# File lib/wordz/generator.rb, line 24
def build_instruction(str)
  Wordz::Instruction.new(str)
end
evaluate_instruction(instruction_text) click to toggle source
# File lib/wordz/generator.rb, line 39
def evaluate_instruction(instruction_text)
  instruction = build_instruction(instruction_text)

  if instruction.macro?
    evaluate_macro(instruction)
  elsif instruction.method?
    evaluate_method(instruction)
  else
    evaluate_literal(instruction)
  end
end
evaluate_literal(instruction) click to toggle source
# File lib/wordz/generator.rb, line 51
def evaluate_literal(instruction)
  with_probability(instruction) do
    output << instruction.content
  end
end
evaluate_macro(instruction) click to toggle source
# File lib/wordz/generator.rb, line 57
def evaluate_macro(instruction)
  with_probability(instruction) do
    generate_list(instruction.content)
  end
end
evaluate_method(instruction) click to toggle source
# File lib/wordz/generator.rb, line 63
def evaluate_method(instruction)
  with_probability(instruction) do
    receiver = extract_method_receiver(instruction)
    method_name = extract_method_name(instruction)
    output << receiver.send(method_name)
  end
end
extract_method_name(method_instruction) click to toggle source
# File lib/wordz/generator.rb, line 78
def extract_method_name(method_instruction)
  spit_method_instruction(method_instruction)[1]
end
extract_method_receiver(method_instruction) click to toggle source
# File lib/wordz/generator.rb, line 71
def extract_method_receiver(method_instruction)
  receiver_name = spit_method_instruction(method_instruction).first.to_sym
  subjects[receiver_name] || raise(
    UndefinedReceiverError, "No subject specified for #{receiver_name.inspect}."
  )
end
generate_list(key) click to toggle source
# File lib/wordz/generator.rb, line 28
def generate_list(key)
  instruction_lists = grammar[key]

  if instruction_lists
    instruction_lists.sample.each(&method(:evaluate_instruction))
    output
  else
    raise UndefinedMacroError, "Grammar does not contain key #{key}."
  end
end
spit_method_instruction(method_instruction) click to toggle source
# File lib/wordz/generator.rb, line 82
def spit_method_instruction(method_instruction)
  method_instruction.content.split("#").reject(&:empty?)
end
with_probability(instruction) { || ... } click to toggle source
# File lib/wordz/generator.rb, line 86
def with_probability(instruction)
  yield if instruction.probability >= Kernel.rand
end