mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
a98359faa7
- Enumerator::Chain - Enumerable#chain - Enumerable#+
61 lines
964 B
Ruby
61 lines
964 B
Ruby
##
|
|
# chain.rb Enumerator::Chain class
|
|
# See Copyright Notice in mruby.h
|
|
|
|
module Enumerable
|
|
def chain(*args)
|
|
Enumerator::Chain.new(self, *args)
|
|
end
|
|
|
|
def +(other)
|
|
Enumerator::Chain.new(self, other)
|
|
end
|
|
end
|
|
|
|
class Enumerator
|
|
class Chain
|
|
include Enumerable
|
|
|
|
def initialize(*args)
|
|
@enums = args
|
|
end
|
|
|
|
def initialize_copy(orig)
|
|
@enums = orig.__copy_enums
|
|
end
|
|
|
|
def each(&block)
|
|
return to_enum unless block_given?
|
|
|
|
@enums.each { |e| e.each(&block) }
|
|
|
|
self
|
|
end
|
|
|
|
def size
|
|
@enums.reduce(0) do |a, e|
|
|
return nil unless e.respond_to?(:size)
|
|
a + e.size
|
|
end
|
|
end
|
|
|
|
def rewind
|
|
@enums.reverse_each do |e|
|
|
e.rewind if e.respond_to?(:rewind)
|
|
end
|
|
|
|
self
|
|
end
|
|
|
|
def inspect
|
|
"#<#{self.class}: #{@enums.inspect}>"
|
|
end
|
|
|
|
def __copy_enums
|
|
@enums.each_with_object([]) do |e, a|
|
|
a << e.clone
|
|
end
|
|
end
|
|
end
|
|
end
|