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