summaryrefslogtreecommitdiff
path: root/lib/family_tree.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/family_tree.rb')
-rw-r--r--lib/family_tree.rb68
1 files changed, 66 insertions, 2 deletions
diff --git a/lib/family_tree.rb b/lib/family_tree.rb
index 934d32e..ebb2955 100644
--- a/lib/family_tree.rb
+++ b/lib/family_tree.rb
@@ -1,15 +1,79 @@
# frozen_string_literal: true
+require 'singleton'
+
+require_relative 'person'
+require_relative 'family_factory'
+
class FamilyTree
+ include Singleton
+
+ attr_accessor :families, :people
+
def initialize
+ @families = FamilyFactory.new.create_families
@people = []
end
+ def add_family(family)
+ @families << family unless @families.include?(family)
+ end
+
def add_child(*params)
puts "Adding Child with params: #{params.join(', ')}"
end
- def query_hierarchy(*params)
- puts "Querying Hierarcy with params: #{params.join(', ')}"
+ def get_relationship(name, relationship)
+ family = find_family(name)
+
+ return [] if family.nil?
+
+ if child_of_family?(family, name)
+ case relationship.downcase
+ when 'mother'
+ mother = find_mother(family)
+ return mother.is_a?(NilPerson) ? [] : [mother]
+ when 'father'
+ father = find_father(family)
+ return father.is_a?(NilPerson) ? [] : [father]
+ when 'siblings'
+ return find_siblings(family, name)
+ else
+ return []
+ end
+ end
+
+ []
+ end
+
+ def find_family(name)
+ families.each do |family|
+ family.children.each do |child|
+ return family if child.name.casecmp(name).zero?
+ end
+ end
+ nil
+ end
+
+ def find_mother(family)
+ mother = family.mother
+ mother || NilPerson.new
+ end
+
+ def find_father(family)
+ father = family.father
+ father || NilPerson.new
+ end
+
+ def find_siblings(family, name)
+ family.children.reject { |child| child.name.casecmp(name).zero? }
+ end
+
+ def child_of_family?(family, name)
+ return false unless family.is_a?(Family)
+
+ family.children.any? do |child|
+ child.name.casecmp(name).zero?
+ end
end
end