diff options
| author | dearblue <[email protected]> | 2019-01-01 13:21:12 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2019-01-03 18:16:26 +0900 |
| commit | a98359faa7927a0443e25a7787546ddf93c06ba9 (patch) | |
| tree | 5083bb34986d7e926373cb3cf519bf05c55e46bb | |
| parent | 3e59f25eef8faf2677071dfc1add7142e92549e7 (diff) | |
| download | mruby-a98359faa7927a0443e25a7787546ddf93c06ba9.tar.gz mruby-a98359faa7927a0443e25a7787546ddf93c06ba9.zip | |
Add enumerator chain feature (CRuby-2.6 compatible)
- Enumerator::Chain
- Enumerable#chain
- Enumerable#+
| -rw-r--r-- | mrbgems/mruby-enum-chain/mrbgem.rake | 6 | ||||
| -rw-r--r-- | mrbgems/mruby-enum-chain/mrblib/chain.rb | 60 |
2 files changed, 66 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-chain/mrbgem.rake b/mrbgems/mruby-enum-chain/mrbgem.rake new file mode 100644 index 000000000..7294f2644 --- /dev/null +++ b/mrbgems/mruby-enum-chain/mrbgem.rake @@ -0,0 +1,6 @@ +MRuby::Gem::Specification.new('mruby-enum-chain') do |spec| + spec.license = 'MIT' + spec.author = 'mruby developers' + spec.summary = 'Enumerator::Chain class' + spec.add_dependency('mruby-enumerator', :core => 'mruby-enumerator') +end 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 |
