diff options
author | Lars Ingebrigtsen <larsi@gnus.org> | 2022-08-09 19:18:55 +0200 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2022-08-09 19:21:36 +0200 |
commit | 5269842833471c960352ced3c60ce2329660b8cf (patch) | |
tree | 714d09b0548bc57c2f5b7d0a8d492cea452cafcc /lisp/emacs-lisp | |
parent | b92e88875802724af9e08201ea65a96dd5f20ff1 (diff) | |
download | emacs-5269842833471c960352ced3c60ce2329660b8cf.tar.gz emacs-5269842833471c960352ced3c60ce2329660b8cf.tar.bz2 emacs-5269842833471c960352ced3c60ce2329660b8cf.zip |
Add a faster seq-uniq for lists
* lisp/emacs-lisp/seq.el (seq-uniq): Add a faster method for lists
(bug#57079).
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/seq.el | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el index 1b8d86563a1..6ddd8de6e8d 100644 --- a/lisp/emacs-lisp/seq.el +++ b/lisp/emacs-lisp/seq.el @@ -455,6 +455,23 @@ TESTFN is used to compare elements, or `equal' if TESTFN is nil." (setq result (cons elt result)))) (nreverse result))) +(cl-defmethod seq-uniq ((sequence list) &optional testfn) + (let ((result nil)) + (if (not testfn) + ;; Fast path. + (while sequence + (unless (member (car sequence) result) + (push (car sequence) result)) + (pop sequence)) + ;; Slower path. + (while sequence + (unless (seq-find (lambda (elem) + (funcall testfn elem (car sequence))) + result) + (push (car sequence) result)) + (pop sequence))) + (nreverse result))) + (cl-defgeneric seq-mapcat (function sequence &optional type) "Concatenate the result of applying FUNCTION to each element of SEQUENCE. The result is a sequence of type TYPE, or a list if TYPE is nil." |