Class: Traversal::Iterator

Inherits:
Enumerator
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/traversal/iterator.rb

Overview

Traversal iterator.

Instance Method Summary collapse

Constructor Details

#initialize(description) ⇒ Iterator

Create new traversal iterator from traversal description

Raises:

  • (TypeError)


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/traversal/iterator.rb', line 16

def initialize(description)
  raise TypeError,
        'Traversal::Description expected, %s given' % description.class.name \
        unless description.is_a?(Traversal::Description)

  @description = description
  start_node = @description.start_node

  # Map of visited nodes
  @visited = {}

  # Create underlying Enumerator
  @enumerator = Enumerator.new do |yielder|
    @yielder = yielder

    begin
      yield_node(start_node)

      expand_node(start_node) if @description.expand_node?(start_node)
    rescue StopIteration
      # ignore
    end
  end

  # Wrap underlying enumerator
  super() do |y|
    @enumerator.each { |e| y << e }
  end
end