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