Module: SimpleTree
- Included in:
- FileTree
- Defined in:
- lib/filetree/simple_tree.rb
Overview
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
-
#ancestors ⇒ Object
Return an array containing every ancestor of the current node.
- #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
#ancestors ⇒ Object
Return an array containing every ancestor of the current node.
110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/filetree/simple_tree.rb', line 110 def ancestors d = Array.new current = self.parent() d << current until d.include?(current.parent) current = current.parent d << current end d.flatten end |
#children ⇒ Object
22 |
# File 'lib/filetree/simple_tree.rb', line 22 def children() raise "children must be overridden"; end |
#descendants ⇒ Object
Return an array containing every descendant of the current node.
126 127 128 129 130 131 132 133 134 135 |
# File 'lib/filetree/simple_tree.rb', line 126 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.
96 97 98 99 100 101 102 103 104 105 |
# File 'lib/filetree/simple_tree.rb', line 96 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.
141 142 143 |
# File 'lib/filetree/simple_tree.rb', line 141 def grandparent parent.parent if parent # returns nil by default if no parent end |
#has_children? ⇒ Boolean
Determine whether the node has children.
60 61 62 |
# File 'lib/filetree/simple_tree.rb', line 60 def has_children? not is_leaf? end |
#has_parent? ⇒ Boolean
Determine whether the node has a parent.
52 53 54 |
# File 'lib/filetree/simple_tree.rb', line 52 def has_parent? not is_root? end |
#height ⇒ Object
Return the height of this subtree. A single node has height 1.
68 69 70 71 72 |
# File 'lib/filetree/simple_tree.rb', line 68 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.
28 29 30 31 32 33 34 |
# File 'lib/filetree/simple_tree.rb', line 28 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.
40 41 42 43 44 45 46 |
# File 'lib/filetree/simple_tree.rb', line 40 def is_root? if parent false else true end end |
#leaves ⇒ Object
Return all the leaf nodes having the current node as an ancestor.
149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/filetree/simple_tree.rb', line 149 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
21 |
# File 'lib/filetree/simple_tree.rb', line 21 def parent() raise "parent must be overridden"; end |
#siblings ⇒ Object
Return an array containing the siblings of the current node.
78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/filetree/simple_tree.rb', line 78 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)
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/filetree/simple_tree.rb', line 168 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 |