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

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

[elpa] externals/vertico af3d263 1/2: Optimize vertico--group-by with ha


From: Protesilaos Stavrou
Subject: [elpa] externals/vertico af3d263 1/2: Optimize vertico--group-by with hash table
Date: Tue, 18 May 2021 11:19:33 -0400 (EDT)

branch: externals/vertico
commit af3d2638cc82e14aa806cff573483332ea17ed09
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    Optimize vertico--group-by with hash table
---
 vertico.el | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/vertico.el b/vertico.el
index 555d80b..503a3a8 100644
--- a/vertico.el
+++ b/vertico.el
@@ -280,20 +280,22 @@
 (defun vertico--group-by (fun elems)
   "Group ELEMS by FUN."
   (when elems
-    (let ((groups))
+    (let ((group-list) (group-hash (make-hash-table :test #'equal)))
       (while elems
         (let* ((key (funcall fun (car elems) nil))
-               (group (cdr (assoc key groups))))
+               (group (gethash key group-hash)))
           (if group
               (setcdr group (setcdr (cdr group) elems)) ;; Append to tail of 
group
-            (push `(,key ,elems . ,elems) groups)) ;; New group (key head . 
tail)
+            (setq group (cons elems elems)) ;; (head . tail)
+            (push group group-list)
+            (puthash key group group-hash))
           (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)))))))
+      (setcdr (cdar group-list) nil) ;; Unlink last tail
+      (setq group-list (nreverse group-list))
+      (prog1 (caar group-list)
+        (while (cdr group-list)
+          (setcdr (cdar group-list) (caadr group-list)) ;; Link groups
+          (setq group-list (cdr group-list)))))))
 
 (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]