emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 47ee31a: Backport seq.el changes from Emacs master


From: Nicolas Petton
Subject: [elpa] master 47ee31a: Backport seq.el changes from Emacs master
Date: Tue, 25 Oct 2016 10:39:32 +0000 (UTC)

branch: master
commit 47ee31a42844ab55e3739ed53233bf40fe7bda19
Author: Nicolas Petton <address@hidden>
Commit: Nicolas Petton <address@hidden>

    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 <address@hidden>
 ;; Keywords: sequences
-;; Version: 2.16
+;; Version: 2.19
 ;; Package: seq
 
 ;; Maintainer: address@hidden
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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]