branch: master commit 47ee31a42844ab55e3739ed53233bf40fe7bda19 Author: Nicolas Petton <nico...@petton.fr> Commit: Nicolas Petton <nico...@petton.fr>
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. --- packages/seq/seq-24.el | 7 +++++++ packages/seq/seq-25.el | 9 ++++++++- packages/seq/seq.el | 2 +- packages/seq/tests/seq-tests.el | 16 ++++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/seq/seq-24.el b/packages/seq/seq-24.el index 04688d3..09fbf04 100644 --- a/packages/seq/seq-24.el +++ b/packages/seq/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/packages/seq/seq-25.el b/packages/seq/seq-25.el index a497f70..f1282a1 100644 --- a/packages/seq/seq-25.el +++ b/packages/seq/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/packages/seq/seq.el b/packages/seq/seq.el index 9f96ec8..6bbb307 100644 --- a/packages/seq/seq.el +++ b/packages/seq/seq.el @@ -4,7 +4,7 @@ ;; Author: Nicolas Petton <nico...@petton.fr> ;; Keywords: sequences -;; Version: 2.16 +;; Version: 2.19 ;; Package: seq ;; Maintainer: emacs-de...@gnu.org diff --git a/packages/seq/tests/seq-tests.el b/packages/seq/tests/seq-tests.el index cf3da78..53930fa 100644 --- a/packages/seq/tests/seq-tests.el +++ b/packages/seq/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