]> gitweb.factorcode.org Git - factor.git/commitdiff
random: implement random for assocs.
authorJohn Benediktsson <mrjbq7@gmail.com>
Wed, 3 Oct 2012 17:08:08 +0000 (10:08 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 3 Oct 2012 17:08:08 +0000 (10:08 -0700)
basis/random/random.factor

index 394cc62c9f9868fd14e9f66575e60d0e35cd1745..5b8c1b3e7b81eb4a6ce7d85634473556686d24cb 100644 (file)
@@ -2,10 +2,10 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien.c-types alien.data arrays assocs
 byte-arrays byte-vectors combinators combinators.short-circuit
-fry io.backend io.binary kernel locals math math.bitwise
-math.constants math.functions math.order math.ranges namespaces
-sequences sequences.private sets summary system vocabs hints
-typed ;
+fry hashtables hashtables.private hints io.backend io.binary
+kernel locals math math.bitwise math.constants math.functions
+math.order math.ranges namespaces sequences sequences.private
+sets summary system typed vocabs ;
 IN: random
 
 SYMBOL: system-random-generator
@@ -72,6 +72,16 @@ M: sequence random
         [ length random-integer ] keep nth
     ] if-empty ;
 
+M: assoc random >alist random ;
+
+M: hashtable random
+    dup assoc-size [ drop f ] [
+        [ 0 ] [ array>> ] [ random ] tri* 1 + [
+            [ 2dup array-nth tombstone? [ 2 + ] 2dip ] loop
+        ] times [ 2 - ] dip
+        [ array-nth ] [ [ 1 + ] dip array-nth ] 2bi 2array
+    ] if-zero ;
+
 : randomize-n-last ( seq n -- seq )
     [ dup length dup ] dip - 1 max '[ dup _ > ]
     [ [ random ] [ 1 - ] bi [ pick exchange-unsafe ] keep ]