[#35631] [Ruby 1.9 - Bug #4558][Open] TestSocket#test_closed_read fails after r31230 — Tomoyuki Chikanaga <redmine@...>

23 messages 2011/04/06

[#35632] [Ruby 1.9 - Bug #4559][Open] Proc#== does not match the documented behaviour — Adam Prescott <redmine@...>

13 messages 2011/04/06

[#35637] [Ruby 1.9 - Bug #4561][Open] 1.9.2 requires parentheses around argument of method call in an array, where 1.8.7 did not — Dave Schweisguth <redmine@...>

9 messages 2011/04/07

[#35666] caching of the ancestor chain — Xavier Noria <fxn@...>

Why does Ruby cache the ancestors chain? I mean, not why the implementation implies that, but why it works that way conceptually.

9 messages 2011/04/09

[#35734] [Ruby 1.9 - Feature #4574][Open] Numeric#within — redmine@...

16 messages 2011/04/13

[#35753] [Ruby 1.9 - Bug #4576][Open] Range#step miss the last value, if end-exclusive and has float number — redmine@...

61 messages 2011/04/14
[#39566] [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number — Marc-Andre Lafortune <ruby-core@...> 2011/09/15

[#39590] [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number — Marc-Andre Lafortune <ruby-core@...> 2011/09/16

[#39593] Re: [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number — Tanaka Akira <akr@...> 2011/09/16

2011/9/17 Marc-Andre Lafortune <ruby-core@marc-andre.ca>:

[#39608] Re: [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number — Masahiro TANAKA <masa16.tanaka@...> 2011/09/17

I have not been watching ruby-core, but let me give a comment for this issue.

[#35765] [Ruby 1.9 - Bug #4579][Open] SecureRandom + OpenSSL may repeat with fork — redmine@...

27 messages 2011/04/15

[#35866] [Ruby 1.9 - Bug #4603][Open] lib/csv.rb: when the :encoding parameter is not provided, the encoding of CSV data is treated as ASCII-8BIT — yu nobuoka <nobuoka@...>

13 messages 2011/04/24

[#35879] [Ruby 1.9 - Bug #4610][Open] Proc#curry behavior is inconsistent with lambdas containing default argument values — Joshua Ballanco <jballanc@...>

11 messages 2011/04/25

[#35883] [Ruby 1.9 - Bug #4611][Open] [BUG] Segementation fault reported — Deryl Doucette <me@...>

15 messages 2011/04/25

[#35895] [Ruby 1.9 - Feature #4614][Open] [RFC/PATCH] thread_pthread.c: lower RUBY_STACK_MIN_LIMIT to 64K — Eric Wong <normalperson@...>

10 messages 2011/04/25

[ruby-core:35639] [Ruby 1.9 - Feature #4553][Open] [PATCH] Add Set#pick and Set#pop

From: Michael Edgar <adgar@...>
Date: 2011-04-07 04:49:04 UTC
List: ruby-core #35639
I put this on the 1.9 redmine, but for some reason it appears no e-mail went out to the mailing list, so I've re-sent this feature request.

http://redmine.ruby-lang.org/issues/4553

------------------------------

A very common operation on sets is to take an arbitrary element from them at O(1) cost. I know typically it's suggested that library additions go out as a gem to see community review. However, to me it seems to be a glaring omission to lack such an operation on a built-in, fundamental data structure, so I've gone straight to the bug tracker.

I wasn't too sure which method names to use as I've often heard "take" in lieu of "pop," so I just used the names Wikipedia uses. Consider them flexible. "pick" selects an arbitrary element, and "pop" both selects and deletes it.

I've provided a very simple patch that implements the necessary behavior. Thoughts?

Michael Edgar
adgar@carboni.ca
http://carboni.ca/


Attachments (1)

pick_pop.diff (1.06 KB, text/x-diff)
Index: lib/set.rb
===================================================================
--- lib/set.rb	(revision 31238)
+++ lib/set.rb	(working copy)
@@ -223,6 +223,20 @@
     self
   end
 
+  # Picks an arbitrary element from the set and returns it. Use +pop+ to
+  # pick and delete simultaneously.
+  def pick
+    @hash.first.first
+  end
+
+  # Picks an arbitrary element from the set and deletes it. Use +pick+ to
+  # pick without deletion.
+  def pop
+    key = pick
+    @hash.delete(key)
+    key
+  end
+
   # Adds the given object to the set and returns self.  Use +merge+ to
   # add many elements at once.
   def add(o)
@@ -1027,6 +1041,24 @@
     }
   end
 
+  def test_pick
+    set = Set[5,3,1]
+    assert_equal(true, set.include?(set.pick))
+  end
+
+  def test_pop
+    total = Set[9,1,8,2,7]
+    
+    current = Set[9,1,8,2,7]
+    removed = Set[]
+    
+    until current.empty?
+      removed << current.pop
+      assert_equal(total, current | removed)
+      assert_equal(true, (current & removed).empty?)
+    end
+  end
+
   def test_add
     set = Set[1,2,3]
 

In This Thread

Prev Next