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