Module: Piggly::Parser::Traversal
- Included in:
- NodeClass
- Defined in:
- lib/piggly/parser/traversal.rb
Overview
Routines for traversing a tree; assumes base class defines elements as a method that returns a list of child nodes
Instance Method Summary collapse
-
#count ⇒ Object
:yields: NodeClass => boolean.
-
#find ⇒ Object
:yields: NodeClass => boolean.
-
#flatten ⇒ Object
:yields: NodeClass.
-
#inject(init) ⇒ Object
:yields: NodeClass => init.
-
#select ⇒ Object
:yields: NodeClass => boolean.
Instance Method Details
#count ⇒ Object
:yields: NodeClass => boolean
19 20 21 |
# File 'lib/piggly/parser/traversal.rb', line 19 def count # :yields: NodeClass => boolean inject(0){|sum, e| yield(e) ? sum + 1 : sum } end |
#find ⇒ Object
:yields: NodeClass => boolean
23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/piggly/parser/traversal.rb', line 23 def find # :yields: NodeClass => boolean found = false catch :done do inject(nil) do |_,e| if yield(e) found = e throw :done end end end found end |
#flatten ⇒ Object
:yields: NodeClass
40 41 42 43 44 45 46 |
# File 'lib/piggly/parser/traversal.rb', line 40 def flatten # :yields: NodeClass if block_given? inject([]){|list,e| list << yield(e) } else inject([]){|list,e| list << e } end end |
#inject(init) ⇒ Object
:yields: NodeClass => init
9 10 11 12 13 14 15 16 17 |
# File 'lib/piggly/parser/traversal.rb', line 9 def inject(init) # :yields: NodeClass => init if elements elements.inject(yield(init, self)) do |state, e| e.inject(state){|succ, n| yield(succ, n) } end else yield(init, self) end end |
#select ⇒ Object
:yields: NodeClass => boolean
36 37 38 |
# File 'lib/piggly/parser/traversal.rb', line 36 def select # :yields: NodeClass => boolean inject([]){|list,e| yield(e) ? list << e : list } end |