summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--NEWS5
-rw-r--r--lib/set.rb25
3 files changed, 34 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index a14bbfab51..30dcff9db5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sun May 30 22:18:49 2010 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/set.rb (keep_if, select!): New methods [ruby-core:29749]
+
Sun May 30 21:51:59 2010 Yusuke Endoh <mame@tsg.ne.jp>
* test/rake/test_application.rb: update a test because of r28089.
diff --git a/NEWS b/NEWS
index 7d11950289..4a1708930c 100644
--- a/NEWS
+++ b/NEWS
@@ -373,6 +373,11 @@ with all sufficient information, see the ChangeLog file.
* Readline.completion_proc= accepts nil.
nil means to use default completion proc.
+* set
+ * new methods:
+ * Set#keep_if
+ * Set#select!
+
* time
* incompatible changes:
* Time.parse raises ArgumentError when no date information.
diff --git a/lib/set.rb b/lib/set.rb
index 0835f8a4ca..5e4e0878bd 100644
--- a/lib/set.rb
+++ b/lib/set.rb
@@ -266,6 +266,14 @@ class Set
self
end
+ # Deletes every element of the set for which block evaluates to
+ # false, and returns self.
+ def keep_if
+ block_given? or return enum_for(__method__)
+ to_a.each { |o| @hash.delete(o) unless yield(o) }
+ self
+ end
+
# Replaces the elements with ones returned by collect().
def collect!
block_given? or return enum_for(__method__)
@@ -284,6 +292,15 @@ class Set
size == n ? nil : self
end
+ # Equivalent to Set#keep_if, but returns nil if no changes were
+ # made.
+ def select!
+ block_given? or return enum_for(__method__)
+ n = size
+ keep_if { |o| yield(o) }
+ size == n ? nil : self
+ end
+
# Merges the elements of the given enumerable object to the set and
# returns self.
def merge(enum)
@@ -563,6 +580,14 @@ class SortedSet < Set
self
end
+ def keep_if
+ block_given? or return enum_for(__method__)
+ n = @hash.size
+ super
+ @keys = nil if @hash.size != n
+ self
+ end
+
def merge(enum)
@keys = nil
super