branch: externals/vertico commit 2c3bdb201dbbd66a79cf6067063bb2b9f3c82d41 Author: Daniel Mendler <m...@daniel-mendler.de> Commit: Daniel Mendler <m...@daniel-mendler.de>
Optimize vertico--group-by --- vertico.el | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/vertico.el b/vertico.el index c19609c..555d80b 100644 --- a/vertico.el +++ b/vertico.el @@ -279,14 +279,21 @@ (defun vertico--group-by (fun elems) "Group ELEMS by FUN." - (let ((groups)) - (dolist (cand elems) - (let* ((key (funcall fun cand nil)) - (group (assoc key groups))) - (if group - (setcdr group (cons cand (cdr group))) - (push (list key cand) groups)))) - (nreverse (mapcan #'cdr groups)))) + (when elems + (let ((groups)) + (while elems + (let* ((key (funcall fun (car elems) nil)) + (group (cdr (assoc key groups)))) + (if group + (setcdr group (setcdr (cdr group) elems)) ;; Append to tail of group + (push `(,key ,elems . ,elems) groups)) ;; New group (key head . tail) + (setq elems (cdr elems)))) + (setcdr (cddar groups) nil) ;; Unlink last tail + (setq groups (nreverse groups)) + (prog1 (cadar groups) + (while (cdr groups) + (setcdr (cddar groups) (cadadr groups)) ;; Link groups + (setq groups (cdr groups))))))) (defun vertico--update-candidates (pt content bounds metadata) "Preprocess candidates given PT, CONTENT, BOUNDS and METADATA."