diff options
author | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-05-30 13:15:17 +0000 |
---|---|---|
committer | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-05-30 13:15:17 +0000 |
commit | e286d4ef603ab58659e93f1e80ce5a1e83f1dea0 (patch) | |
tree | 56aca9f66606215d86dd362bab4f4bb28baffb3c /lib/set.rb | |
parent | 6bbd1d622fb4650786e8400e9de7926bab097d73 (diff) |
* lib/set.rb (keep_if, select!): New methods [ruby-core:29749]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@28095 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/set.rb')
-rw-r--r-- | lib/set.rb | 25 |
1 files changed, 25 insertions, 0 deletions
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 |