Method: Jinx::Visitor#sync
- Defined in:
- lib/jinx/helpers/visitor.rb
#sync {|nodes, others| ... } ⇒ Object
Returns a new visitor that traverses a collection of parent nodes in lock-step fashion using this visitor. The synced #visit method applies the visit operator block to an array of child nodes taken from each parent node, e.g.:
parent1 = Node.new(1)
child11 = Node.new(2, parent1)
child12 = Node.new(3, parent1)
parent2 = Node.new(1)
child21 = Node.new(3, parent2)
Jinx::Visitor.new { |node| node.children }.sync.to_enum.to_a #=> [
[parent1, parent2],
[child11, child21],
[child12, nil]
]
By default, the children are grouped in enumeration order. If a block is given to this method, then the block is called to match child nodes, e.g. using the above example:
visitor = Jinx::Visitor.new { |node| node.children }
synced = visitor.sync { |nodes, others| nodes.to_compact_hash { others.detect { |other| node.value == other.value } } }
synced.to_enum.to_a #=> [
[parent1, parent2],
[child11, nil],
[child12, child21]
]
164 165 166 |
# File 'lib/jinx/helpers/visitor.rb', line 164 def sync(&matcher) SyncVisitor.new(self, &matcher) end |