diff options
author | Philip Kaludercic <philipk@posteo.net> | 2022-08-12 16:05:05 +0200 |
---|---|---|
committer | Philip Kaludercic <philipk@posteo.net> | 2022-08-12 16:05:05 +0200 |
commit | 1823349e6a61b2997b27cdb1ff42c69739693455 (patch) | |
tree | ed09268f8e57ab9196ff59df000c5f1268e09853 /lisp/emacs-lisp/seq.el | |
parent | faa7f03b0c5b6d2c51bb185cf5a0f422ba0fb956 (diff) | |
parent | 829b131e5b3ad3b077be9d31215770b251341c68 (diff) | |
download | emacs-1823349e6a61b2997b27cdb1ff42c69739693455.tar.gz emacs-1823349e6a61b2997b27cdb1ff42c69739693455.tar.bz2 emacs-1823349e6a61b2997b27cdb1ff42c69739693455.zip |
Merge remote-tracking branch 'origin/master' into feature/package+vc
Diffstat (limited to 'lisp/emacs-lisp/seq.el')
-rw-r--r-- | lisp/emacs-lisp/seq.el | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el index 1b8d86563a1..b6f0f66e5b1 100644 --- a/lisp/emacs-lisp/seq.el +++ b/lisp/emacs-lisp/seq.el @@ -455,6 +455,33 @@ 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. If the list is long, use a hash table to speed + ;; things up even more. + (let ((l (length sequence))) + (if (> l 100) + (let ((hash (make-hash-table :test #'equal :size l))) + (while sequence + (unless (gethash (car sequence) hash) + (setf (gethash (car sequence) hash) t) + (push (car sequence) result)) + (setq sequence (cdr sequence)))) + ;; Short list. + (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." |