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

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

[elpa] externals/corfu 091ce57: Optimize corfu--move-prefix-candidates-t


From: ELPA Syncer
Subject: [elpa] externals/corfu 091ce57: Optimize corfu--move-prefix-candidates-to-front (See #48)
Date: Sun, 8 Aug 2021 18:57:06 -0400 (EDT)

branch: externals/corfu
commit 091ce57e87c666342c8f082737caabd762801e23
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    Optimize corfu--move-prefix-candidates-to-front (See #48)
---
 corfu.el | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/corfu.el b/corfu.el
index 2a6c240..addd5e8 100644
--- a/corfu.el
+++ b/corfu.el
@@ -460,11 +460,35 @@ completion began less than that number of seconds ago."
       (and (= (length x) (length y))
            (string< x y))))
 
+(defmacro corfu--partition! (list form)
+  "Evaluate FORM for every element and partition LIST."
+  (let ((head1 (make-symbol "head1"))
+        (head2 (make-symbol "head2"))
+        (tail1 (make-symbol "tail1"))
+        (tail2 (make-symbol "tail2")))
+    `(let* ((,head1 (cons nil nil))
+            (,head2 (cons nil nil))
+            (,tail1 ,head1)
+            (,tail2 ,head2))
+       (while ,list
+         (if (let ((it (car ,list))) ,form)
+             (progn
+               (setcdr ,tail1 ,list)
+               (pop ,tail1))
+           (setcdr ,tail2 ,list)
+           (pop ,tail2))
+         (pop ,list))
+       (setcdr ,tail1 (cdr ,head2))
+       (setcdr ,tail2 nil)
+       (setq ,list (cdr ,head1)))))
+
 (defun corfu--move-prefix-candidates-to-front (field candidates)
   "Move CANDIDATES which match prefix of FIELD to the beginning."
-  (let ((word (replace-regexp-in-string " .*" "" field)))
-    (nconc (seq-filter (lambda (x) (string-prefix-p word x)) candidates)
-           (seq-remove (lambda (x) (string-prefix-p word x)) candidates))))
+  (let* ((word (replace-regexp-in-string " .*" "" field))
+         (len (length word)))
+    (corfu--partition! candidates
+                       (and (>= (length it) len)
+                            (eq t (compare-strings word 0 len it 0 len))))))
 
 (defun corfu--filter-files (files)
   "Filter FILES by `completion-ignored-extensions'."



reply via email to

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