branch: externals/seq
commit 158ec91aa4ea22079f32a0c15cd011b4a9fe17ea
Author: Nicolas Petton <[email protected]>
Commit: Stefan Monnier <[email protected]>
Backport seq.el changes from Emacs master
* packages/seq/seq-24.el:
* packages/seq/seq-25.el (seq-random-elt): New function.
* packages/seq/seq.el: Bump version to 2.19.
* packages/seq/tests/seq-tests.el: Add tests for seq-random-elt.
---
seq-24.el | 7 +++++++
seq-25.el | 9 ++++++++-
seq.el | 2 +-
tests/seq-tests.el | 16 ++++++++++++++++
4 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/seq-24.el b/seq-24.el
index 04688d3ba3..09fbf04680 100644
--- a/seq-24.el
+++ b/seq-24.el
@@ -371,6 +371,13 @@ SEQUENCE must be a sequence of numbers or markers."
SEQUENCE must be a sequence of numbers or markers."
(apply #'max (seq-into sequence 'list)))
+(defun seq-random-elt (sequence)
+ "Return a random element from SEQUENCE.
+Return nil if SEQUENCE is nil."
+ (if (seq-empty-p sequence)
+ (error "Sequence cannot be empty")
+ (seq-elt sequence (random (seq-length sequence)))))
+
(defun seq--drop-list (list n)
"Return a list from LIST without its first N elements.
This is an optimization for lists in `seq-drop'."
diff --git a/seq-25.el b/seq-25.el
index a497f70319..f1282a17e1 100644
--- a/seq-25.el
+++ b/seq-25.el
@@ -91,7 +91,7 @@ given, and the match does not fail."
ARGS can also include the `&rest' marker followed by a variable
name to be bound to the rest of SEQUENCE."
- (declare (indent 2) (debug t))
+ (declare (indent 2) (debug (sexp form body)))
`(pcase-let ((,(seq--make-pcase-patterns args) ,sequence))
,@body))
@@ -494,5 +494,12 @@ SEQUENCE must be a sequence of numbers or markers."
If no element is found, return nil."
(ignore-errors (seq-elt sequence n))))
+(cl-defgeneric seq-random-elt (sequence)
+ "Return a random element from SEQUENCE.
+Return nil if SEQUENCE is nil."
+ (if (seq-empty-p sequence)
+ (error "Sequence cannot be empty")
+ (seq-elt sequence (random (seq-length sequence)))))
+
(provide 'seq-25)
;;; seq-25.el ends here
diff --git a/seq.el b/seq.el
index 9f96ec861b..6bbb3074a3 100644
--- a/seq.el
+++ b/seq.el
@@ -4,7 +4,7 @@
;; Author: Nicolas Petton <[email protected]>
;; Keywords: sequences
-;; Version: 2.16
+;; Version: 2.19
;; Package: seq
;; Maintainer: [email protected]
diff --git a/tests/seq-tests.el b/tests/seq-tests.el
index cf3da78b1c..53930fa598 100644
--- a/tests/seq-tests.el
+++ b/tests/seq-tests.el
@@ -350,5 +350,21 @@ Evaluate BODY for each created sequence.
(should (equal (seq-sort-by #'seq-length #'> seq)
["xxx" "xx" "x"]))))
+(ert-deftest test-seq-random-elt-take-all ()
+ (let ((seq '(a b c d e))
+ (count '()))
+ (should (= 0 (map-length count)))
+ (dotimes (_ 1000)
+ (let ((random-elt (seq-random-elt seq)))
+ (map-put count
+ random-elt
+ (map-elt count random-elt 0))))
+ (should (= 5 (map-length count)))))
+
+(ert-deftest test-seq-random-elt-signal-on-empty ()
+ (should-error (seq-random-elt nil))
+ (should-error (seq-random-elt []))
+ (should-error (seq-random-elt "")))
+
(provide 'seq-tests)
;;; seq-tests.el ends here