From 60a1cb67a0dd69870ae682a459755b8a79f9b256 Mon Sep 17 00:00:00 2001
From: Evan Mezeske <evan@meebo-inc.com>
Date: Sun, 20 May 2012 14:23:04 -0700
Subject: [PATCH] Add clojure.core/shuffle and a test.

---
 src/cljs/cljs/core.cljs       |    7 +++++++
 test/cljs/cljs/core_test.cljs |    7 +++++++
 2 files changed, 14 insertions(+)

diff --git a/src/cljs/cljs/core.cljs b/src/cljs/cljs/core.cljs
index cb86d9f..888030e 100644
--- a/src/cljs/cljs/core.cljs
+++ b/src/cljs/cljs/core.cljs
@@ -997,6 +997,13 @@ reduces them without incurring seq initialization"
             (recur nval (next coll))))
         val))))
 
+(defn shuffle
+  "Return a random permutation of coll"
+  [coll]
+  (let [a (to-array coll)]
+    (garray/shuffle a)
+    (vec a)))
+
 (defn reduce
   "f should be a function of 2 arguments. If val is not supplied,
   returns the result of applying f to the first 2 items in coll, then
diff --git a/test/cljs/cljs/core_test.cljs b/test/cljs/cljs/core_test.cljs
index 0f46da3..2ce5fb7 100644
--- a/test/cljs/cljs/core_test.cljs
+++ b/test/cljs/cljs/core_test.cljs
@@ -626,6 +626,13 @@
   (assert (= ["a" [ 1 2] "foo"] (sort-by count ["foo" "a" [1 2]])))
   (assert (= ["foo" [1 2] "a"] (sort-by count > ["foo" "a" [1 2]])))
 
+  ;; shuffle
+  (let [coll [1 2 3 4 5 6 7 8 9 10]
+        ; while it is technically possible for this test to fail with a false negative,
+        ; it's _extraordinarily_ unlikely.
+        shuffles (filter #(not= coll %) (take 100 (iterate shuffle coll)))]
+    (assert (not (empty? shuffles))))
+
   ;; js->clj
   (assert (= {"a" 1, "b" 2} (js->clj (js* "{\"a\":1,\"b\":2}"))))
   (assert (= {"a" nil} (js->clj (js* "{\"a\":null}"))))
-- 
1.7.10.2

