implement flatten_merge, flatten, flatten!

This commit is contained in:
yui-knk
2014-08-03 12:45:54 +09:00
parent dd10f722ad
commit 2836acf045
3 changed files with 125 additions and 13 deletions
-3
View File
@@ -40,9 +40,6 @@ These methods are not implemented yet.
+ taint
+ untaint
+ to_set
+ flatten_merge
+ flatten
+ flatten!
+ classify
+ divide
+29 -8
View File
@@ -82,14 +82,35 @@ class Set
# def to_set
# end
#
# def flatten_merge
# end
#
# def flatten
# end
#
# def flatten!
# end
def flatten_merge(set, seen = Set.new)
set.each { |e|
if e.is_a?(Set)
if seen.include?(e_id = e.object_id)
raise ArgumentError, "tried to flatten recursive Set"
end
seen.add(e_id)
flatten_merge(e, seen)
seen.delete(e_id)
else
add(e)
end
}
self
end
def flatten
self.class.new.flatten_merge(self)
end
def flatten!
if detect { |e| e.is_a?(Set) }
replace(flatten())
else
nil
end
end
def include?(o)
@hash.include?(o)
+96 -2
View File
@@ -113,8 +113,102 @@ assert("Set#to_a") do
assert_equal([1,2,3], ary.sort)
end
#assert("Set#flatten") do
#end
assert("Set#flatten") do
# test1
set1 = Set[
1,
Set[
5,
Set[7,
Set[0]
],
Set[6,2],
1
],
3,
Set[3,4]
]
set2 = set1.flatten
set3 = Set.new(0..7)
assert_false set1.equal?(set2) # assert_not_same
assert_equal(set3, set2)
# test2; multiple occurrences of a set in an set
set1 = Set[1, 2]
set2 = Set[set1, Set[set1, 4], 3]
assert_nothing_raised {
set3 = set2.flatten
}
assert_equal(Set.new(1..4), set3)
# test3; recursion
set2 = Set[]
set1 = Set[1, set2]
set2.add(set1)
assert_raise(ArgumentError) {
set1.flatten
}
end
assert("Set#flatten!") do
# test1
set1 = Set[
1,
Set[
5,
Set[7,
Set[0]
],
Set[6,2],
1
],
3,
Set[3,4]
]
set3 = Set.new(0..7)
orig_set1 = set1
set1.flatten!
assert_true orig_set1.equal?(set1) # assert_same
assert_equal(set3, set1)
# test2; multiple occurrences of a set in an set
set1 = Set[1, 2]
set2 = Set[set1, Set[set1, 4], 3]
assert_nothing_raised {
set2.flatten!
}
assert_equal(Set.new(1..4), set2)
# test3; recursion
set2 = Set[]
set1 = Set[1, set2]
set2.add(set1)
assert_raise(ArgumentError) {
set1.flatten!
}
# test5; miscellaneous
assert_nil(Set.new(0..31).flatten!)
x = Set[Set[],Set[1,2]].flatten!
y = Set[1,2]
assert_equal(x, y)
end
assert("Set#include?") do
set = Set[1,2,3]