summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-array-ext
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-26 01:53:15 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-26 01:53:15 +0900
commit2202e412ea6ac44a5bcdaa2640fda0b7485437ca (patch)
tree3e217007696283ad64188ae979a1c0de33a0d947 /mrbgems/mruby-array-ext
parent44ec41a7724ef3591e9d4033655fa12e79b9ff2b (diff)
parentb8e5cb71fe4b7e5377facf23ecebd0dd4bc4d1ab (diff)
downloadmruby-2202e412ea6ac44a5bcdaa2640fda0b7485437ca.tar.gz
mruby-2202e412ea6ac44a5bcdaa2640fda0b7485437ca.zip
Merge branch 'master' of github.com:mruby/mruby
Diffstat (limited to 'mrbgems/mruby-array-ext')
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb30
-rw-r--r--mrbgems/mruby-array-ext/test/array.rb14
2 files changed, 44 insertions, 0 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index 67f7e51a7..9ef7eb166 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -627,4 +627,34 @@ class Array
end
self
end
+
+ ##
+ # call-seq:
+ # ary.keep_if { |item| block } -> ary
+ # ary.keep_if -> Enumerator
+ #
+ # Deletes every element of +self+ for which the given block evaluates to
+ # +false+.
+ #
+ # See also Array#select!
+ #
+ # If no block is given, an Enumerator is returned instead.
+ #
+ # a = [1, 2, 3, 4, 5]
+ # a.keep_if { |val| val > 3 } #=> [4, 5]
+
+ def keep_if(&block)
+ return to_enum :keep_if unless block_given?
+
+ idx = 0
+ len = self.size
+ while idx < self.size do
+ if block.call(self[idx])
+ idx += 1
+ else
+ self.delete_at(idx)
+ end
+ end
+ self
+ end
end
diff --git a/mrbgems/mruby-array-ext/test/array.rb b/mrbgems/mruby-array-ext/test/array.rb
index 47ffa00cf..c76423522 100644
--- a/mrbgems/mruby-array-ext/test/array.rb
+++ b/mrbgems/mruby-array-ext/test/array.rb
@@ -252,3 +252,17 @@ assert("Array#delete_if") do
a = [ 1, 2, 3, 4, 5 ]
assert_equal [1, 2, 3], a.delete_if { |val| val > 3 }
end
+
+assert("Array#keep_if") do
+ a = [1, 2, 3, 4, 5]
+ assert_equal [1, 2, 3, 4, 5], a.keep_if { true }
+ assert_equal [1, 2, 3, 4, 5], a
+
+ a = [1, 2, 3, 4, 5]
+ assert_equal [], a.keep_if { false }
+ assert_equal [], a
+
+ a = [1, 2, 3, 4, 5]
+ assert_equal [4, 5], a.keep_if { |val| val > 3 }
+ assert_equal [4, 5], a
+end