lib/dentaku/calculator.rb in dentaku-3.3.4 vs lib/dentaku/calculator.rb in dentaku-3.4.0

- old
+ new

@@ -60,11 +60,11 @@ node = expression node = ast(node) unless node.is_a?(AST::Node) unbound = node.dependencies - memory.keys unless unbound.empty? raise UnboundVariableError.new(unbound), - "no value provided for variables: #{unbound.join(', ')}" + "no value provided for variables: #{unbound.uniq.join(', ')}" end node.value(memory) end end @@ -75,17 +75,25 @@ def solve(expression_hash, &block) BulkExpressionSolver.new(expression_hash, self).solve(&block) end def dependencies(expression, context = {}) - if expression.is_a? Array - return expression.flat_map { |e| dependencies(e, context) } + test_context = context.nil? ? {} : store(context) { memory } + + case expression + when Dentaku::AST::Node + expression.dependencies(test_context) + when Array + expression.flat_map { |e| dependencies(e, context) } + else + ast(expression).dependencies(test_context) end - store(context) { ast(expression).dependencies(memory) } end def ast(expression) + return expression.map { |e| ast(e) } if expression.is_a? Array + @ast_cache.fetch(expression) { options = { case_sensitive: case_sensitive, function_registry: @function_registry, aliases: aliases @@ -117,10 +125,10 @@ def store(key_or_hash, value = nil) restore = Hash[memory] if value.nil? - key_or_hash = FlatHash.from_hash(key_or_hash) if nested_data_support + key_or_hash = FlatHash.from_hash_with_intermediates(key_or_hash) if nested_data_support key_or_hash.each do |key, val| memory[standardize_case(key.to_s)] = val end else memory[standardize_case(key_or_hash.to_s)] = value