lib/basic_tree.rb in basic_tree-0.0.1 vs lib/basic_tree.rb in basic_tree-0.1.0
- old
+ new
@@ -1,79 +1,46 @@
class BasicTree
- class Children
- include Enumerable
- def each(&block)
- trees.each(&block)
- end
-
- def empty?
- trees.empty?
- end
-
- private
-
- def trees
- @trees ||= []
- end
-
- def <<(tree)
- trees << tree
- end
- end
-
include Enumerable
def initialize(object, &block)
self.object = object
yield self if block_given?
end
- attr_accessor :object
- attr_reader :parent
+ attr_accessor :object, :parent
def add(object, &block)
self.class.new(object) do |child|
- children.send(:<<, child)
- child.send(:parent=, self)
+ children << child
+ child.parent = self
yield child if block_given?
end
end
- def each(&block)
- children.each(&block)
- end
-
def path
ancestors << self
end
def ancestors
root? ? [] : (parent.ancestors << parent)
end
- def descendants(depth = -1)
- trees = []
- if depth != 0
- children.each do |child|
- trees << child
- trees += child.descendants(depth - 1)
- end
- end
- trees
+ def descendants
+ children.map { |c| [c] + c.descendants }.flatten
end
- def subtree(depth = -1)
- [self] + descendants(depth)
+ def subtree
+ [self] + descendants
end
def siblings
- parent.children.select { |child| child != self }
+ root? ? [] : parent.children.select { |child| child != self }
end
def root
- ancestors.first
+ path.first
end
def level
path.size
end
@@ -84,22 +51,10 @@
def leaf?
children.empty?
end
- def leaves
- trees = []
- children.each do |child|
- child.leaf? ? (trees << child) : (trees += child.leaves)
- end
- trees
- end
-
- private
-
- attr_writer :parent
-
def children
- @children ||= Children.new
+ @children ||= []
end
end
\ No newline at end of file