Merge pull request #2142 from cremno/rename-mrb_str_buf_append
[mruby.git] / mrbgems / mruby-array-ext / mrblib / array.rb
index 9ef7eb1..bddcd8a 100644 (file)
@@ -657,4 +657,34 @@ class Array
     end
     self
   end
+
+  ##
+  #  call-seq:
+  #     ary.select!  {|item| block } -> ary or nil
+  #     ary.select!                  -> Enumerator
+  #
+  #  Invokes the given block passing in successive elements from +self+,
+  #  deleting elements for which the block returns a +false+ value.
+  #
+  #  If changes were made, it will return +self+, otherwise it returns +nil+.
+  #
+  #  See also Array#keep_if
+  #
+  #  If no block is given, an Enumerator is returned instead.
+
+  def select!(&block)
+    return to_enum :select! 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
+    return nil if self.size == len
+    self
+  end
 end