lib/soroban/sheet.rb in soroban-0.4.0 vs lib/soroban/sheet.rb in soroban-0.5.4

- old
+ new

@@ -12,10 +12,11 @@ # Creates a new sheet. def initialize(logger=nil) @logger = logger @cells = {} + @changes = Hash.new{ |h, k| h[k] = Set.new } @bindings = {} end # Used for calling dynamically defined functions, and for creating new # cells (via `label=`). @@ -104,22 +105,50 @@ def _debug(message) return if @logger.nil? @logger.debug "SOROBAN: #{message}" end + def _link(name, dependencies) + dependencies.each { |target| @changes[target] << name if name != target } + end + + def _unlink(name, dependencies) + dependencies.each { |target| @changes[target].delete(name) } + end + def _add(label, contents) + name = @bindings[label.to_sym] || label + if cells.has_key?(name) + cell = eval("@#{name}", binding) + cell.set(contents) + return + end internal = "@#{label}" _expose(internal, label) cell = Cell.new(binding) _set(label, cell, contents) instance_variable_set(internal, cell) end def _set(label_or_name, cell, contents) label = label_or_name.to_sym name = @bindings[label] || label + _unlink(name, cell.dependencies) cell.set(contents) @cells[name] = cell.dependencies + _link(name, cell.dependencies) + _clear(name) + end + + def _clear(name) + @changes[name].each do |target| + next unless @cells.has_key?(target) + begin + eval("@#{target.to_s}.clear") + _clear(target) + rescue + end + end end def _get(label_or_name, cell) label = label_or_name.to_sym name = @bindings[label] || label