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( = {}) node_enumerator = each_node() Enumerator.new do |yielder| stop = false until stop begin yielder << node_enumerator.next.content rescue StopIteration stop = true end end end end |
#each_level ⇒ Object
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( = {}, &block) = { traversal: :depth_first } = .merge() method_name = traversal_modes[[:traversal]] if method_name send(method_name, &block) else available = traversal_modes.keys.join(', ') raise ArgumentError, "invalid traversal mode: #{[:traversal]} (#{available})" end end |