class Bud::LatticeWrapper
Attributes
accumulate_tick_deltas[RW]
bud_instance[RW]
rescan_on_delta[R]
tabname[R]
wired_by[R]
Public Class Methods
new(tabname, klass, bud_i)
click to toggle source
# File lib/bud/lattice-core.rb, line 400 def initialize(tabname, klass, bud_i) @tabname = tabname @klass = klass @bud_instance = bud_i @wired_by = [] @rescan_on_delta = Set.new end
Public Instance Methods
<=(i)
click to toggle source
# File lib/bud/lattice-core.rb, line 487 def <=(i) if @bud_instance.wiring? setup_wiring(i, :output) else @new_delta = do_merge(current_new_delta, i) end end
add_merge_target()
click to toggle source
XXX: refactor with BudCollection to avoid duplication of code
# File lib/bud/lattice-core.rb, line 509 def add_merge_target toplevel = @bud_instance.toplevel if toplevel.done_bootstrap toplevel.merge_targets[toplevel.this_stratum] << self end end
add_rescan_invalidate(rescan, invalidate)
click to toggle source
# File lib/bud/lattice-core.rb, line 531 def add_rescan_invalidate(rescan, invalidate) end
bootstrap()
click to toggle source
# File lib/bud/lattice-core.rb, line 545 def bootstrap # Bootstrap blocks might install lattice values via either <= (@new_delta) # or <+ (@pending). if @new_delta merge_to_storage(@new_delta) @new_delta = nil end if @pending merge_to_storage(@pending) @pending = nil end end
current_delta()
click to toggle source
# File lib/bud/lattice-core.rb, line 450 def current_delta @delta ||= @klass.new @delta end
current_new_delta()
click to toggle source
# File lib/bud/lattice-core.rb, line 455 def current_new_delta @new_delta ||= @klass.new @new_delta end
current_pending()
click to toggle source
# File lib/bud/lattice-core.rb, line 460 def current_pending @pending ||= @klass.new @pending end
current_value()
click to toggle source
# File lib/bud/lattice-core.rb, line 445 def current_value @storage ||= @klass.new @storage end
do_merge(lhs, rhs)
click to toggle source
# File lib/bud/lattice-core.rb, line 465 def do_merge(lhs, rhs) unless lhs.class <= Bud::Lattice raise Bud::Error, "unexpected merge input: #{lhs.class}" end return lhs if rhs.nil? unless rhs.class <= @klass rhs = @klass.new(rhs) end rv = lhs.merge(rhs) unless rv.class <= Bud::Lattice raise Bud::Error, "#{lhs.class}\#merge did not return lattice value: #{rv.inspect}" end rv end
flush_deltas()
click to toggle source
# File lib/bud/lattice-core.rb, line 528 def flush_deltas end
insert(i, source)
click to toggle source
Merge āiā into @new_delta
# File lib/bud/lattice-core.rb, line 483 def insert(i, source) @new_delta = do_merge(current_new_delta, i) end
inspect()
click to toggle source
# File lib/bud/lattice-core.rb, line 592 def inspect "{#{@tabname}, #{current_value.inspect}}" end
invalidate_at_tick()
click to toggle source
# File lib/bud/lattice-core.rb, line 412 def invalidate_at_tick false end
merge_to_storage(v)
click to toggle source
# File lib/bud/lattice-core.rb, line 568 def merge_to_storage(v) m = do_merge(current_value, v) if m != current_value @storage = m @rescan_on_delta.each do |e| if e.kind_of? Bud::ScannerElement e.force_rescan = true else e.rescan = true end end return true else return false end end
method_missing(meth, *args, &blk)
click to toggle source
Calls superclass method
# File lib/bud/lattice-core.rb, line 534 def method_missing(meth, *args, &blk) # If we're invoking a lattice method and we're currently wiring up the # dataflow, wire up a dataflow element to invoke the given method. if @bud_instance.wiring? pusher = to_push_elem Bud::PushApplyMethod.new(@bud_instance, pusher, meth, args, blk) else super end end
positive_predecessors()
click to toggle source
# File lib/bud/lattice-core.rb, line 433 def positive_predecessors @wired_by.select {|e| e.outputs.include?(self) || e.pendings.include?(self)} end
qualified_tabname()
click to toggle source
# File lib/bud/lattice-core.rb, line 408 def qualified_tabname @qualified_tabname ||= @bud_instance.toplevel? ? @tabname : "#{@bud_instance.qualified_name}.#{@tabname}".to_sym end
setup_wiring(input, kind)
click to toggle source
# File lib/bud/lattice-core.rb, line 416 def setup_wiring(input, kind) if input.class <= Bud::LatticeWrapper input.to_push_elem.wire_to(self, kind) elsif (input.class <= Bud::LatticePushElement || input.class <= Bud::PushElement) input.wire_to(self, kind) elsif input.class <= Bud::BudCollection input.pro.wire_to(self, kind) elsif input.class <= Proc tbl = register_coll_expr(input) tbl.pro.wire_to(self, kind) else raise Bud::Error, "unrecognized wiring input: #{input}" end add_merge_target end
tick()
click to toggle source
# File lib/bud/lattice-core.rb, line 559 def tick if @new_delta raise Bud::Error, "orphaned delta value for lattice #{@tabname}: #{@new_delta.inspect}" end merge_to_storage(@pending) @pending = nil @delta = nil end
tick_deltas()
click to toggle source
# File lib/bud/lattice-core.rb, line 585 def tick_deltas result = merge_to_storage(@new_delta) @delta = @new_delta @new_delta = nil return result end
to_push_elem()
click to toggle source
# File lib/bud/lattice-core.rb, line 516 def to_push_elem toplevel = @bud_instance.toplevel this_stratum = toplevel.this_stratum oid = self.object_id unless toplevel.scanners[this_stratum][[oid, @tabname]] scanner = Bud::LatticeScanner.new(@bud_instance, self) toplevel.scanners[this_stratum][[oid, @tabname]] = scanner toplevel.push_sources[this_stratum][[oid, @tabname]] = scanner end return toplevel.scanners[this_stratum][[oid, @tabname]] end
Private Instance Methods
register_coll_expr(expr)
click to toggle source
# File lib/bud/lattice-core.rb, line 438 def register_coll_expr(expr) name = "expr_#{expr.object_id}".to_sym @bud_instance.coll_expr(name, expr, nil) @bud_instance.send(name) end