lib/dentaku/calculator.rb in dentaku-2.0.8 vs lib/dentaku/calculator.rb in dentaku-2.0.9

- old
+ new

@@ -1,6 +1,5 @@ -require 'dentaku' require 'dentaku/bulk_expression_solver' require 'dentaku/exceptions' require 'dentaku/token' require 'dentaku/dependency_resolver' require 'dentaku/parser' @@ -11,10 +10,11 @@ def initialize clear @tokenizer = Tokenizer.new @ast_cache = {} + @disable_ast_cache = false end def add_function(name, type, body) Dentaku::AST::Function.register(name, type, body) self @@ -23,10 +23,17 @@ def add_functions(fns) fns.each { |(name, type, body)| add_function(name, type, body) } self end + def disable_cache + @disable_ast_cache = true + yield(self) if block_given? + ensure + @disable_ast_cache = false + end + def evaluate(expression, data={}) evaluate!(expression, data) rescue UnboundVariableError, ArgumentError yield expression if block_given? end @@ -52,15 +59,28 @@ end def ast(expression) @ast_cache.fetch(expression) { Parser.new(tokenizer.tokenize(expression)).parse.tap do |node| - @ast_cache[expression] = node if Dentaku.cache_ast? + @ast_cache[expression] = node if cache_ast? end } end + def clear_cache(pattern=:all) + case pattern + when :all + @ast_cache = {} + when String + @ast_cache.delete(pattern) + when Regexp + @ast_cache.delete_if { |k,_| k =~ pattern } + else + fail Dentaku::ArgumentError + end + end + def store(key_or_hash, value=nil) restore = Hash[memory] if value.nil? key_or_hash.each do |key, val| @@ -93,8 +113,12 @@ @memory = {} end def empty? memory.empty? + end + + def cache_ast? + Dentaku.cache_ast? && !@disable_ast_cache end end end