summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Petton <nicolas@petton.fr>2016-06-18 09:32:18 +0200
committerNicolas Petton <nicolas@petton.fr>2016-06-18 10:10:00 +0200
commit9726856f297522b1773e8aadaec34dd1a8e68a14 (patch)
tree083da055818463b396d6aed5deed1a61aa205180
parent44eca25a4bd1513f08ca380c9f6722c21376ac9f (diff)
downloademacs-9726856f297522b1773e8aadaec34dd1a8e68a14.tar.gz
Add seq-do-indexed
* lisp/emacs-lisp/seq.el (seq-do-indexed): New function. * test/lisp/emacs-lisp/seq-tests.el: Add a unit test for seq-do-indexed.
-rw-r--r--lisp/emacs-lisp/seq.el12
-rw-r--r--test/lisp/emacs-lisp/seq-tests.el15
2 files changed, 26 insertions, 1 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 166e886fd80..20610a7027d 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -4,7 +4,7 @@
;; Author: Nicolas Petton <nicolas@petton.fr>
;; Keywords: sequences
-;; Version: 2.16
+;; Version: 2.17
;; Package: seq
;; Maintainer: emacs-devel@gnu.org
@@ -117,6 +117,16 @@ Return SEQUENCE."
(defalias 'seq-each #'seq-do)
+(defun seq-do-indexed (function sequence)
+ "Apply FUNCTION to each element of SEQUENCE and return nil.
+Unlike `seq-map', FUNCTION takes two arguments: the element of
+the sequence, and its index within the sequence."
+ (let ((index 0))
+ (seq-do (lambda (elt)
+ (funcall function elt index)
+ (setq index (1+ index)))
+ sequence)))
+
(cl-defgeneric seqp (sequence)
"Return non-nil if SEQUENCE is a sequence, nil otherwise."
(sequencep sequence))
diff --git a/test/lisp/emacs-lisp/seq-tests.el b/test/lisp/emacs-lisp/seq-tests.el
index 50543de8ada..b227de36e97 100644
--- a/test/lisp/emacs-lisp/seq-tests.el
+++ b/test/lisp/emacs-lisp/seq-tests.el
@@ -107,6 +107,21 @@ Evaluate BODY for each created sequence.
'(a b c d))
'((a 0) (b 1) (c 2) (d 3)))))
+(ert-deftest test-seq-do-indexed ()
+ (let ((result nil))
+ (seq-do-indexed (lambda (elt i)
+ (add-to-list 'result (list elt i)))
+ nil)
+ (should (equal result nil)))
+ (with-test-sequences (seq '(4 5 6))
+ (let ((result nil))
+ (seq-do-indexed (lambda (elt i)
+ (add-to-list 'result (list elt i)))
+ seq)
+ (should (equal (seq-elt result 0) '(6 2)))
+ (should (equal (seq-elt result 1) '(5 1)))
+ (should (equal (seq-elt result 2) '(4 0))))))
+
(ert-deftest test-seq-filter ()
(with-test-sequences (seq '(6 7 8 9 10))
(should (equal (seq-filter #'test-sequences-evenp seq) '(6 8 10)))