summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/seq.el
diff options
context:
space:
mode:
authorDamien Cassou <damien@cassou.me>2022-09-04 13:21:59 +0200
committerLars Ingebrigtsen <larsi@gnus.org>2022-09-04 13:21:59 +0200
commit4751b51d5e1182975aa002af08a625e4859ec276 (patch)
tree1dcabd8ede4a44d931d998dca9ddba21d2faa324 /lisp/emacs-lisp/seq.el
parent4d50d413e67dd8ae183af8b68f315a667ebf2add (diff)
downloademacs-4751b51d5e1182975aa002af08a625e4859ec276.tar.gz
emacs-4751b51d5e1182975aa002af08a625e4859ec276.tar.bz2
emacs-4751b51d5e1182975aa002af08a625e4859ec276.zip
Add new function `seq-positions'
* doc/lispref/sequences.texi (Sequence Functions): Document it. * lisp/emacs-lisp/seq.el (seq-positions): New function. * lisp/emacs-lisp/shortdoc.el (sequence): Mention it. * test/lisp/emacs-lisp/seq-tests.el (test-seq-positions): Test it (bug#57548).
Diffstat (limited to 'lisp/emacs-lisp/seq.el')
-rw-r--r--lisp/emacs-lisp/seq.el17
1 files changed, 17 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 64197b55e5f..31dcfa98b40 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -460,6 +460,23 @@ Equality is defined by the function TESTFN, which defaults to `equal'."
nil)))
;;;###autoload
+(cl-defgeneric seq-positions (sequence elt &optional testfn)
+ "Return indices for which (TESTFN (seq-elt SEQUENCE index) ELT) is non-nil.
+
+TESTFN is a two-argument function which is passed each element of
+SEQUENCE as first argument and ELT as second. TESTFN defaults to
+`equal'.
+
+The result is a list of (zero-based) indices."
+ (let ((result '()))
+ (seq-do-indexed
+ (lambda (e index)
+ (when (funcall (or testfn #'equal) e elt)
+ (push index result)))
+ sequence)
+ (nreverse result)))
+
+;;;###autoload
(cl-defgeneric seq-uniq (sequence &optional testfn)
"Return a list of the elements of SEQUENCE with duplicates removed.
TESTFN is used to compare elements, or `equal' if TESTFN is nil."