summary refs log tree commit diff
path: root/mew.scm
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2022-11-26 18:06:19 +0100
committerLeah Neukirchen <leah@vuxu.org>2022-11-26 18:06:19 +0100
commit2a0f96114fb75ecf6975812a041e96f7b9d161c5 (patch)
tree5b6753580edd6aec550f8d00f7177ca1f7d453b9 /mew.scm
parentb33a8d20e524ecf57568a3af8e814a7fb3f7dd62 (diff)
downloadmew-2a0f96114fb75ecf6975812a041e96f7b9d161c5.tar.gz
mew-2a0f96114fb75ecf6975812a041e96f7b9d161c5.tar.xz
mew-2a0f96114fb75ecf6975812a041e96f7b9d161c5.zip
add shuffle
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))