Module: Forester::Iterators

Included in:
TreeNode
Defined in:
lib/forester/tree_node_ext/iterators.rb

Constant Summary collapse

TRAVERSAL_MODES =
{
  depth_first: :each,
  breadth_first: :breadth_each,
  preorder: :preordered_each,
  postorder: :postordered_each
}.freeze

Instance Method Summary collapse

Instance Method Details

#each_content(options = {}) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/forester/tree_node_ext/iterators.rb', line 26

def each_content(options = {})
  node_enumerator = each_node(options)

  Enumerator.new do |yielder|
    stop = false
    until stop
      begin
        yielder << node_enumerator.next.content
      rescue StopIteration
        stop = true
      end
    end
  end
end

#each_levelObject



41
42
43
44
45
46
47
48
49
# File 'lib/forester/tree_node_ext/iterators.rb', line 41

def each_level
  Enumerator.new do |yielder|
    level = [self]
    until level.empty?
      yielder << level
      level = level.flat_map(&:children)
    end
  end
end

#each_node(options = {}, &block) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/forester/tree_node_ext/iterators.rb', line 10

def each_node(options = {}, &block)
  default_options = {
    traversal: :depth_first
  }
  options = default_options.merge(options)

  method_name = traversal_modes[options[:traversal]]

  if method_name
    send(method_name, &block)
  else
    available = traversal_modes.keys.join(', ')
    raise ArgumentError, "invalid traversal mode: #{options[:traversal]} (#{available})"
  end
end