diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-17 12:46:51 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-17 12:46:51 +0900 |
| commit | db8265f428175ac19885e14c5b1beb3e8f6c5af4 (patch) | |
| tree | 43bbd8f6d32cd9ffe25880f159cce0a61cdb9246 | |
| parent | 4e365156d130e94a9c7937f498b438183efca954 (diff) | |
| download | mruby-db8265f428175ac19885e14c5b1beb3e8f6c5af4.tar.gz mruby-db8265f428175ac19885e14c5b1beb3e8f6c5af4.zip | |
Add `Comparable#uniq`; CRuby2.4
| -rw-r--r-- | mrbgems/mruby-enum-ext/mrblib/enum.rb | 16 | ||||
| -rw-r--r-- | mrbgems/mruby-enum-lazy/mrblib/lazy.rb | 15 |
2 files changed, 31 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb index 7741e515d..327b573d4 100644 --- a/mrbgems/mruby-enum-ext/mrblib/enum.rb +++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb @@ -708,4 +708,20 @@ module Enumerable def nil.to_h {} end + + def uniq(&block) + hash = {} + if block + self.each do|*v| + v = v.__svalue + hash[block.call(v)] ||= v + end + else + self.each do|*v| + v = v.__svalue + hash[v] ||= v + end + end + hash.values + end end diff --git a/mrbgems/mruby-enum-lazy/mrblib/lazy.rb b/mrbgems/mruby-enum-lazy/mrblib/lazy.rb index c98681edf..9227abe8a 100644 --- a/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +++ b/mrbgems/mruby-enum-lazy/mrblib/lazy.rb @@ -158,6 +158,21 @@ class Enumerator } end + def uniq(&block) + hash = {} + Lazy.new(self){|yielder, val| + if block + v = block.call(val) + else + v = val + end + unless hash.include?(v) + yielder << val + hash[v] = val + end + } + end + alias force to_a end end |
