From dcad562f7364e68724c024e2969ee1f1957f7263 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Mon, 5 May 2014 11:52:16 +0900 Subject: Add Hash#keep_if --- mrbgems/mruby-hash-ext/mrblib/hash.rb | 23 +++++++++++++++++++++++ mrbgems/mruby-hash-ext/test/hash.rb | 7 +++++++ 2 files changed, 30 insertions(+) diff --git a/mrbgems/mruby-hash-ext/mrblib/hash.rb b/mrbgems/mruby-hash-ext/mrblib/hash.rb index 48bade330..a5f04e5e1 100644 --- a/mrbgems/mruby-hash-ext/mrblib/hash.rb +++ b/mrbgems/mruby-hash-ext/mrblib/hash.rb @@ -137,4 +137,27 @@ class Hash self.each {|k, v| h[v] = k } h end + + ## + # call-seq: + # hsh.keep_if {| key, value | block } -> hsh + # hsh.keep_if -> an_enumerator + # + # Deletes every key-value pair from hsh for which block + # evaluates to false. + # + # If no block is given, an enumerator is returned instead. + # + + def keep_if(&block) + return to_enum :keep_if unless block_given? + + keys = [] + self.each do |k, v| + unless block.call([k, v]) + self.delete(k) + end + end + self + end end diff --git a/mrbgems/mruby-hash-ext/test/hash.rb b/mrbgems/mruby-hash-ext/test/hash.rb index 10880666e..1334522ff 100644 --- a/mrbgems/mruby-hash-ext/test/hash.rb +++ b/mrbgems/mruby-hash-ext/test/hash.rb @@ -95,3 +95,10 @@ assert("Hash#invert") do assert_include(%w[a c], h[1]) assert_equal('b', h[2]) end + +assert("Hash#keep_if") do + h = { 1 => 2, 3 => 4, 5 => 6 } + assert_equal({3=>4,5=>6}, h.keep_if {|k, v| k + v >= 7 }) + h = { 1 => 2, 3 => 4, 5 => 6 } + assert_equal({ 1 => 2, 3=> 4, 5 =>6} , h.keep_if { true }) +end -- cgit v1.2.3