From 1d06ff976184b4956a58a867132061c6a5902cd6 Mon Sep 17 00:00:00 2001 From: marcandre Date: Sun, 30 May 2010 13:19:09 +0000 Subject: * lib/set.rb (keep_if, select!): New methods [ruby-core:29749] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28096 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ NEWS | 5 +++++ lib/set.rb | 25 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+) 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 + + * lib/set.rb (keep_if, select!): New methods [ruby-core:29749] + Sun May 30 21:51:59 2010 Yusuke Endoh * 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 -- cgit v1.2.3