Skip to content

Instantly share code, notes, and snippets.

@kuahyeow
Created January 6, 2017 06:56
Show Gist options
  • Save kuahyeow/639f2ccc8f133fa875b2f189d30e16c4 to your computer and use it in GitHub Desktop.
Save kuahyeow/639f2ccc8f133fa875b2f189d30e16c4 to your computer and use it in GitHub Desktop.
class Tree
attr_reader :children, :item
def initialize(item)
@item = item
@children = []
end
def add(child_item)
children << Tree.new(child_item)
end
def search(search_item, &criteria)
if criteria
return self if criteria.call(item, search_item)
else
return self if search_item == item
end
children.each do |child|
if block_given?
result = child.search(search_item, &criteria)
else
result = child.search(search_item)
end
return result if result
end
nil
end
end
require 'test_helper'
describe "tree search" do
let(:item) { [:a, :b, :c] }
let(:tree) { Tree.new(item) }
it "searches on the current node" do
tree.search(item).must_equal tree
end
it "can search by passing in a block" do
tree.search([:a, :z, :z]).must_be_nil
tree.search([:a, :z, :z]){ |item, search_item| item.first == search_item.first }.must_equal tree
end
describe "with children" do
before { tree.add([:x, :y, :z]) }
let(:child) { tree.children.first }
it "can search on children" do
tree.search([:x, :y, :z]).must_equal child
end
it "can search by passing in a block" do
tree.search([:x, :z, :z]).must_be_nil
tree.search([:x, :z, :z]){ |item, search_item| item.first == search_item.first }.must_equal child
end
it "finds nothing on a failed search" do
tree.search([:nothing]).must_be_nil
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment