Add Array#delete_if
authorJun Hiroe <[email protected]>
Thu, 24 Apr 2014 13:49:52 +0000 (24 22:49 +0900)
committerJun Hiroe <[email protected]>
Thu, 24 Apr 2014 14:04:46 +0000 (24 23:04 +0900)
mrbgems/mruby-array-ext/mrblib/array.rb
mrbgems/mruby-array-ext/test/array.rb

index 7da416c..bf9c092 100644 (file)
@@ -513,4 +513,36 @@ class Array
     self[idx, 0] = args
     self
   end
+
+  ##
+  #  call-seq:
+  #     ary.delete_if { |item| block }  -> ary
+  #     ary.delete_if                   -> Enumerator
+  #
+  #  Deletes every element of +self+ for which block evaluates to +true+.
+  #
+  #  The array is changed instantly every time the block is called, not after
+  #  the iteration is over.
+  #
+  #  See also Array#reject!
+  #
+  #  If no block is given, an Enumerator is returned instead.
+  #
+  #     scores = [ 97, 42, 75 ]
+  #     scores.delete_if {|score| score < 80 }   #=> [97]
+
+  def delete_if(&block)
+    return to_enum :delete_if unless block_given?
+
+    idx = 0
+    len = self.size
+    while idx < self.size do
+      if block.call(self[idx])
+        self.delete_at(idx)
+      else
+        idx += 1
+      end
+    end
+    self
+  end
 end
index a82fb08..ba1d4fd 100644 (file)
@@ -223,3 +223,16 @@ assert("Array#insert") do
   b = ["a", "b", "c", "d"]
   assert_equal ["a", "b", "c", "d", nil, nil, 99], b.insert(6, 99)
 end
+
+assert("Array#delete_if") do
+  a = [1, 2, 3, 4, 5]
+  assert_equal [1, 2, 3, 4, 5], a.delete_if { false }
+  assert_equal [1, 2, 3, 4, 5], a
+
+  a = [1, 2, 3, 4, 5]
+  assert_equal [], a.delete_if { true }
+  assert_equal [], a
+
+  a = [ 1, 2, 3, 4, 5 ]
+  assert_equal [1, 2, 3], a.delete_if { |val| val > 3 }
+end