summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-10-17 12:46:51 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-10-17 12:46:51 +0900
commitdb8265f428175ac19885e14c5b1beb3e8f6c5af4 (patch)
tree43bbd8f6d32cd9ffe25880f159cce0a61cdb9246
parent4e365156d130e94a9c7937f498b438183efca954 (diff)
downloadmruby-db8265f428175ac19885e14c5b1beb3e8f6c5af4.tar.gz
mruby-db8265f428175ac19885e14c5b1beb3e8f6c5af4.zip
Add `Comparable#uniq`; CRuby2.4
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb16
-rw-r--r--mrbgems/mruby-enum-lazy/mrblib/lazy.rb15
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