Merge pull request #4603 from shuujii/define-plus-to-Enumerator-and-Enumerator-Chain-instead-of-Enumerable

Define `#+` to `Enumerator` and `Enumerator#Chain` instead of `Enumerable`
This commit is contained in:
Yukihiro "Matz" Matsumoto
2019-07-28 23:43:31 +09:00
committed by GitHub
2 changed files with 21 additions and 6 deletions
+8 -4
View File
@@ -6,13 +6,13 @@ module Enumerable
def chain(*args)
Enumerator::Chain.new(self, *args)
end
def +(other)
Enumerator::Chain.new(self, other)
end
end
class Enumerator
def +(other)
Chain.new(self, other)
end
class Chain
include Enumerable
@@ -50,6 +50,10 @@ class Enumerator
self
end
def +(other)
self.class.new(self, other)
end
def inspect
"#<#{self.class}: #{@enums.inspect}>"
end
+13 -2
View File
@@ -12,7 +12,7 @@ assert("Enumerable#chain") do
assert_raise(NoMethodError) { c.chain }
end
assert("Enumerable#+") do
assert("Enumerator#+") do
a = [].each
b = {}.each
c = Object.new # not has #each method
@@ -24,7 +24,7 @@ assert("Enumerable#+") do
assert_raise(NoMethodError) { c + a }
end
assert("Enumerator.new") do
assert("Enumerator::Chain.new") do
a = []
b = {}
c = Object.new # not has #each method
@@ -84,3 +84,14 @@ assert("Enumerator::Chain#rewind") do
c = e1.chain(e2).each{}.rewind
assert_equal [e2.__id__, e1.__id__], rewound
end
assert("Enumerator::Chain#+") do
a = [].chain
b = {}.chain
c = Object.new # not has #each method
assert_kind_of Enumerator::Chain, a + b
assert_kind_of Enumerator::Chain, a + c
assert_kind_of Enumerator::Chain, b + a
assert_kind_of Enumerator::Chain, b + c
end