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