emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/vertico 2c3bdb2 4/4: Optimize vertico--group-by


From: Protesilaos Stavrou
Subject: [elpa] externals/vertico 2c3bdb2 4/4: Optimize vertico--group-by
Date: Tue, 18 May 2021 01:01:14 -0400 (EDT)

branch: externals/vertico
commit 2c3bdb201dbbd66a79cf6067063bb2b9f3c82d41
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@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."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]