summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorStefan Kangas <stefan@marxist.se>2021-09-17 10:35:13 +0200
committerStefan Kangas <stefan@marxist.se>2021-09-17 11:03:39 +0200
commit0cf0a2b98671671bb7639a17639ef2552b772cbe (patch)
tree026e59bc5d039a649985a127471d06b4636cd0c1 /lisp/emacs-lisp
parentfc10e7fe5ff924ab0047c62a0fd9d72df38b21b6 (diff)
downloademacs-0cf0a2b98671671bb7639a17639ef2552b772cbe.tar.gz
emacs-0cf0a2b98671671bb7639a17639ef2552b772cbe.tar.bz2
emacs-0cf0a2b98671671bb7639a17639ef2552b772cbe.zip
Add new sequence function 'seq-union'
* lisp/emacs-lisp/seq.el (seq-union): New function. * doc/lispref/sequences.texi (Sequence Functions): * lisp/emacs-lisp/shortdoc.el (sequence): Document above new function. * test/lisp/emacs-lisp/seq-tests.el (test-seq-union): New test.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/seq.el11
-rw-r--r--lisp/emacs-lisp/shortdoc.el2
2 files changed, 13 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index f0dc283f57d..b7dcde87f41 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -467,6 +467,17 @@ negative integer or 0, nil is returned."
(setq sequence (seq-drop sequence n)))
(nreverse result))))
+(cl-defgeneric seq-union (sequence1 sequence2 &optional testfn)
+ "Return a list of all elements that appear in either SEQUENCE1 or SEQUENCE2.
+Equality is defined by TESTFN if non-nil or by `equal' if nil."
+ (let ((accum (lambda (acc elt)
+ (if (seq-contains-p acc elt testfn)
+ acc
+ (cons elt acc)))))
+ (seq-reverse
+ (seq-reduce accum sequence2
+ (seq-reduce accum sequence1 '())))))
+
;;;###autoload
(cl-defgeneric seq-intersection (sequence1 sequence2 &optional testfn)
"Return a list of the elements that appear in both SEQUENCE1 and SEQUENCE2.
diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el
index adee6be379d..3e0d5aef022 100644
--- a/lisp/emacs-lisp/shortdoc.el
+++ b/lisp/emacs-lisp/shortdoc.el
@@ -809,6 +809,8 @@ There can be any number of :example/:result elements."
:eval (seq-remove #'numberp '(1 2 c d 5)))
(seq-group-by
:eval (seq-group-by #'cl-plusp '(-1 2 3 -4 -5 6)))
+ (seq-union
+ :eval (seq-union '(1 2 3) '(3 5)))
(seq-difference
:eval (seq-difference '(1 2 3) '(2 3 4)))
(seq-intersection