lib/code/node/if_modifier.rb in code-ruby-0.4.0 vs lib/code/node/if_modifier.rb in code-ruby-0.5.0

- old
+ new

@@ -1,48 +1,47 @@ class Code class Node class IfModifier < Node - IF_KEYWORD = :if - UNLESS_KEYWORD = :unless - WHILE_KEYWORD = :while - UNTIL_KEYWORD = :until + IF_KEYWORD = "if" + UNLESS_KEYWORD = "unless" + WHILE_KEYWORD = "while" + UNTIL_KEYWORD = "until" - def initialize(if_modifier) - @left = ::Code::Node::Statement.new(if_modifier.fetch(:left)) - @operator = if_modifier.fetch(:operator) - @right = ::Code::Node::Statement.new(if_modifier.fetch(:right)) + def initialize(parsed) + @operator = parsed.delete(:operator) + @left = Node::Statement.new(parsed.delete(:left)) + @right = Node::Statement.new(parsed.delete(:right)) + super(parsed) end def evaluate(**args) - if operator == IF_KEYWORD - right = @right.evaluate(**args) + if @operator == IF_KEYWORD + if @right.evaluate(**args).truthy? + @left.evaluate(**args) + else + ::Code::Object::Nothing.new + end + elsif @operator == UNLESS_KEYWORD + if @right.evaluate(**args).falsy? + @left.evaluate(**args) + else + ::Code::Object::Nothing.new + end + elsif @operator == WHILE_KEYWORD + last = ::Code::Object::Nothing.new - right.truthy? ? @left.evaluate(**args) : ::Code::Object::Nothing.new - elsif operator == UNLESS_KEYWORD - right = @right.evaluate(**args) + last = @left.evaluate(**args) while @right.evaluate(**args).truthy? - right.truthy? ? ::Code::Object::Nothing.new : @left.evaluate(**args) - elsif operator == WHILE_KEYWORD - left = ::Code::Object::Nothing.new + last + elsif @operator == UNTIL_KEYWORD + last = ::Code::Object::Nothing.new - left = @left.evaluate(**args) while @right.evaluate(**args).truthy? + last = @left.evaluate(**args) while @right.evaluate(**args).falsy? - left - elsif operator == UNTIL_KEYWORD - left = ::Code::Object::Nothing.new - - left = @left.evaluate(**args) until @right.evaluate(**args).truthy? - - left + last else - raise NotImplementedError.new(operator.inspect) + raise NotImplementedError.new(@operator) end - end - - private - - def operator - @operator.to_sym end end end end