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

Instance Method Details

#countObject

: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

#findObject

: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

#flattenObject

: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

#selectObject

: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