summary refs log tree commit diff
path: root/mew.scm
diff options
context:
space:
mode:
Diffstat (limited to 'mew.scm')
-rw-r--r--mew.scm13
1 files changed, 12 insertions, 1 deletions
diff --git a/mew.scm b/mew.scm
index 1c1674c..c5f1f31 100644
--- a/mew.scm
+++ b/mew.scm
@@ -17,7 +17,7 @@
      odometer one-of op op*
      per prn proj puts
      rand range rep
-     scan scan-right sing? search seq set set-at str slurp
+     scan scan-right sing? search seq set set-at shuffle str slurp
      tally-accumulator tbl time
      while
      uniq-accumulator unlist until
@@ -401,6 +401,17 @@
       ((n)   (pseudo-random-integer n))
       ((n m) (+ n (pseudo-random-integer (- m n))))))
 
+  (define (shuffle v)
+    (let loop ((i (- (vector-length v) 1)))
+      (when (positive? i)
+        (let* ((j (rand (+ i 1)))
+               (vi (vector-ref v i))
+               (vj (vector-ref v j)))
+          (vector-set! v i vj)
+          (vector-set! v j vi)
+          (loop (dec i)))))
+    v)
+
   (define range
     (case-lambda
       (()               (make-range-generator 0 +inf.0 1))