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).
This commit is contained in:
Damien Cassou 2022-09-04 13:21:59 +02:00 committed by Lars Ingebrigtsen
parent 4d50d413e6
commit 4751b51d5e
5 changed files with 54 additions and 0 deletions

View file

@ -459,6 +459,23 @@ Equality is defined by the function TESTFN, which defaults to `equal'."
(setq index (1+ index)))
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.