[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."