Add Array#delete_if
authorJun Hiroe <[email protected]>
Sun, 20 Apr 2014 16:35:00 +0000 (21 01:35 +0900)
committerJun Hiroe <[email protected]>
Sun, 20 Apr 2014 16:40:39 +0000 (21 01:40 +0900)
mrbgems/mruby-array-ext/mrblib/array.rb
mrbgems/mruby-array-ext/test/array.rb

index 6c47235..43d77b5 100644 (file)
@@ -425,4 +425,35 @@ class Array
   def rotate!(count=1)
     self.replace(self.rotate(count))
   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
+    while idx < self.size do
+      if block.call(self[idx])
+        self.delete_at(idx)
+      else
+        idx += 1
+      end
+    end
+    self
+  end
 end
index d157a5b..1fdfabe 100644 (file)
@@ -169,3 +169,17 @@ assert("Array#rotate!") do
   assert_equal ["c", "d", "a", "b"], a.rotate(10)
   assert_equal [], [].rotate!
 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 { |i| i > 3 }
+  assert_equal [1, 2, 3], a
+end