[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 92df7cd923 1/2: Add 'seq-keep'
From: |
Lars Ingebrigtsen |
Subject: |
master 92df7cd923 1/2: Add 'seq-keep' |
Date: |
Tue, 4 Oct 2022 15:46:27 -0400 (EDT) |
branch: master
commit 92df7cd923d0e870f08484cec06c2726be30882b
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Add 'seq-keep'
* doc/lispref/sequences.texi (Sequence Functions): Document it.
* lisp/emacs-lisp/seq.el (seq-keep): New function (bug#58278).
---
doc/lispref/sequences.texi | 13 +++++++++++++
etc/NEWS | 5 +++++
lisp/emacs-lisp/seq.el | 4 ++++
test/lisp/emacs-lisp/seq-tests.el | 6 ++++++
4 files changed, 28 insertions(+)
diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi
index 12c15e6f9a..bc5a4cf24a 100644
--- a/doc/lispref/sequences.texi
+++ b/doc/lispref/sequences.texi
@@ -698,6 +698,19 @@ the same type as @var{sequence}.
@end example
@end defun
+@defun seq-keep function sequence
+ This function returns a list of all non-@code{nil} results from
+calling @var{function} on the elements in @var{sequence}.
+
+@example
+@group
+(seq-keep #'cl-digit-char-p '(?6 ?a ?7))
+@result{} (6 7)
+@end group
+@end example
+
+@end defun
+
@defun seq-reduce function sequence initial-value
@cindex reducing sequences
This function returns the result of calling @var{function} with
diff --git a/etc/NEWS b/etc/NEWS
index eb5d3afbd8..06e91f5d71 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -3150,6 +3150,11 @@ These can be used for buttons in buffers and the like.
See the
This returns a list of the (zero-based) indices of elements matching a
given predicate in the specified sequence.
++++
+** New function 'seq-keep'.
+This is like 'seq-map', but removes all non-nil results from the
+returned list.
+
+++
** New arguments MESSAGE and TIMEOUT of 'set-transient-map'.
MESSAGE specifies a message to display after activating the transient
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 31dcfa98b4..82ade0ac0c 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -695,5 +695,9 @@ which may be shorter."
result))
(nreverse result)))
+(defun seq-keep (function sequence)
+ "Apply FUNCTION to SEQUENCE and return all non-nil results."
+ (delq nil (seq-map function sequence)))
+
(provide 'seq)
;;; seq.el ends here
diff --git a/test/lisp/emacs-lisp/seq-tests.el
b/test/lisp/emacs-lisp/seq-tests.el
index d95b35c45e..e22f86f044 100644
--- a/test/lisp/emacs-lisp/seq-tests.el
+++ b/test/lisp/emacs-lisp/seq-tests.el
@@ -592,5 +592,11 @@ Evaluate BODY for each created sequence.
(should (= (length list) 10000))
(should (= (length (seq-uniq (append list list))) 10000))))
+(ert-deftest test-seq-keep ()
+ (should (equal (seq-keep #'cl-digit-char-p '(?6 ?a ?7))
+ '(6 7)))
+ (should (equal (seq-keep #'cl-digit-char-p [?6 ?a ?7])
+ '(6 7))))
+
(provide 'seq-tests)
;;; seq-tests.el ends here