diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-01-04 14:39:20 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-01-04 14:39:20 +0900 |
| commit | 1e7d6890a5c47b3abc5292156ea31be7b1efdcc2 (patch) | |
| tree | 182e58b6184996d5abed1af61f03b717c27ed892 /mrbgems/mruby-enum-chain/mrblib | |
| parent | 1bf6c84682f5b64300320357274f4c78e00ad9ca (diff) | |
| parent | f392337e10708fa1fbe6f610a9d215835087bf05 (diff) | |
| download | mruby-1e7d6890a5c47b3abc5292156ea31be7b1efdcc2.tar.gz mruby-1e7d6890a5c47b3abc5292156ea31be7b1efdcc2.zip | |
Merge pull request #4210 from dearblue/enum-chain
Add enumerator chain feature (CRuby-2.6 compatible)
Diffstat (limited to 'mrbgems/mruby-enum-chain/mrblib')
| -rw-r--r-- | mrbgems/mruby-enum-chain/mrblib/chain.rb | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-chain/mrblib/chain.rb b/mrbgems/mruby-enum-chain/mrblib/chain.rb new file mode 100644 index 000000000..98515ea14 --- /dev/null +++ b/mrbgems/mruby-enum-chain/mrblib/chain.rb @@ -0,0 +1,60 @@ +## +# 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 |
