Module: SimpleTree
- Defined in:
- lib/simple_tree.rb
Overview
Ruby Tree Interface by Jason M. Adams. Distributed under the BSD license, please see LICENSE for more information.
To use this interface, drop it in your current class with include. You must then simply implement the parent and children methods.
* +parent+ returns the parent node of the current node or else nil if it's a root
* +children+ returns an +Array+ of all children of this node or an empty +Array+ if it is a leaf node
Instance Method Summary collapse
- #children ⇒ Object
-
#descendants ⇒ Object
Return an array containing every descendant of the current node.
-
#family ⇒ Object
Return every node descending from this node’s parent (except this node).
-
#grandparent ⇒ Object
Return the grandparent of this node.
-
#has_children? ⇒ Boolean
Determine whether the node has children.
-
#has_parent? ⇒ Boolean
Determine whether the node has a parent.
-
#height ⇒ Object
Return the height of this subtree.
-
#is_leaf? ⇒ Boolean
Return whether this node is a leaf node in the hierarchy.
-
#is_root? ⇒ Boolean
Determine whether this is the root node in the hierarchy.
-
#leaves ⇒ Object
Return all the leaf nodes having the current node as an ancestor.
- #parent ⇒ Object
-
#siblings ⇒ Object
Return an array containing the siblings of the current node.
-
#tree_rep(depth = 0) ⇒ Object
Helper method for to_s, returns a tree representation of the subtree rooted at this node.
Instance Method Details
#children ⇒ Object
11 |
# File 'lib/simple_tree.rb', line 11 def children() raise "children must be overridden"; end |
#descendants ⇒ Object
Return an array containing every descendant of the current node.
100 101 102 103 104 105 106 107 108 109 |
# File 'lib/simple_tree.rb', line 100 def descendants d = Array.new children.each do |child| d << child d << child.descendants end d.flatten end |
#family ⇒ Object
Return every node descending from this node’s parent (except this node). This include all of the node’s descendants.
85 86 87 88 89 90 91 92 93 94 |
# File 'lib/simple_tree.rb', line 85 def family if parent fam = [parent] + parent.descendants else fam = descendants end fam.delete(self) fam end |
#grandparent ⇒ Object
Return the grandparent of this node.
115 116 117 |
# File 'lib/simple_tree.rb', line 115 def grandparent parent.parent if parent # returns nil by default if no parent end |
#has_children? ⇒ Boolean
Determine whether the node has children.
49 50 51 |
# File 'lib/simple_tree.rb', line 49 def has_children? not is_leaf? end |
#has_parent? ⇒ Boolean
Determine whether the node has a parent.
41 42 43 |
# File 'lib/simple_tree.rb', line 41 def has_parent? not is_root? end |
#height ⇒ Object
Return the height of this subtree. A single node has height 1.
57 58 59 60 61 |
# File 'lib/simple_tree.rb', line 57 def height heights = children.map {|child| child.height} return 1 if heights.size == 0 return heights.max + 1 end |
#is_leaf? ⇒ Boolean
Return whether this node is a leaf node in the hierarchy.
17 18 19 20 21 22 23 |
# File 'lib/simple_tree.rb', line 17 def is_leaf? if children.size == 0 true else false end end |
#is_root? ⇒ Boolean
Determine whether this is the root node in the hierarchy.
29 30 31 32 33 34 35 |
# File 'lib/simple_tree.rb', line 29 def is_root? if parent false else true end end |
#leaves ⇒ Object
Return all the leaf nodes having the current node as an ancestor.
123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/simple_tree.rb', line 123 def leaves outp = Array.new children.each do |child| if child.is_leaf? outp << child else outp << child.leaves end end outp.flatten end |
#parent ⇒ Object
10 |
# File 'lib/simple_tree.rb', line 10 def parent() raise "parent must be overridden"; end |
#siblings ⇒ Object
Return an array containing the siblings of the current node.
67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/simple_tree.rb', line 67 def siblings # handle case where this is the root node return Array.new unless parent sibs = Array.new parent.children.each do |child| next if child.id == self.id sibs << child end sibs end |
#tree_rep(depth = 0) ⇒ Object
Helper method for to_s, returns a tree representation of the subtree rooted at this node. This assumes some sort of identifier is specified for the object being called (self.name, self.identifier, etc)
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/simple_tree.rb', line 142 def tree_rep(depth=0) if self.name ident = self.name elsif self.identifier ident = self.identifier else ident = self.object_id end if depth > 0 outp = " #{([" "] * (depth - 1)).join("|")}\\- #{ident}\n" else outp = "#{ident}\n" end children.each do |child| outp += child.tree_rep(depth + 1) end outp end |