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

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

[nongnu] elpa/flx c45daa261c 124/182: refactor: pull out flx-get-matches


From: ELPA Syncer
Subject: [nongnu] elpa/flx c45daa261c 124/182: refactor: pull out flx-get-matches-worker function
Date: Tue, 13 Dec 2022 03:59:36 -0500 (EST)

branch: elpa/flx
commit c45daa261c3fca5abc06a5ede250615a57971990
Author: Le Wang <l26wang@gmail.com>
Commit: Le Wang <l26wang@gmail.com>

    refactor: pull out flx-get-matches-worker function
---
 flx.el | 112 ++++++++++++++++++++++++++++++-----------------------------------
 1 file changed, 52 insertions(+), 60 deletions(-)

diff --git a/flx.el b/flx.el
index 0d37dbb9cd..17c4fe560b 100644
--- a/flx.el
+++ b/flx.el
@@ -245,76 +245,68 @@ See documentation for logic."
             (puthash str res cache))
           res))))
 
+(defun flx-get-matches-worker (greater-than q-index query-length heatmap 
match-cache str-info query)
+  (let ((hash-key (+ q-index
+                     (* (or greater-than 0)
+                        query-length))))
+    (or
+     (gethash hash-key match-cache)
+     (puthash
+      hash-key
+      (let ((indexes (flx-bigger-sublist
+                      (gethash (aref query q-index) str-info)
+                      greater-than)))
+        (if (>= q-index (1- query-length))
+            (mapcar (lambda (index)
+                      (cons (list index)
+                            (cons (aref heatmap index) 0))) indexes)
+          (let ((match) (best-score most-negative-fixnum))
+            (dolist (index indexes (and match (list match)))
+              (dolist (elem (flx-get-matches-worker index (1+ q-index)
+                                                    query-length heatmap 
match-cache str-info query))
+                (setq elem
+                      (cons (cons index (car elem))
+                            (cons
+                             (+ (cadr elem)
+                                (aref heatmap index)
+                                (if (= (1- (caar elem)) index)
+                                    (+ (* (min (cddr elem)
+                                               3)
+                                          15)
+                                       60)
+                                  0))
+                             (if (= (1- (caar elem)) index)
+                                 (1+ (cddr elem))
+                               0))))
+                ;; we only care about the optimal score
+                (when (> (cadr elem) best-score)
+                  (setq best-score (cadr elem)
+                        match elem)))))))
+      match-cache))))
 
 (defun flx-score (str query &optional cache)
   "return best score matching QUERY against STR"
   (unless (or (zerop (length query))
               (zerop (length str)))
-    (cl-letf*
-        ((hash (flx-process-cache str cache))
-         (heatmap (gethash 'heatmap hash))
+    (let*
+        ((str-info (flx-process-cache str cache))
+         (heatmap (gethash 'heatmap str-info))
          (query-length (length query))
-         (full-match-boost (and (< query-length 5)
-                                (> query-length 1)))
+         (full-match-boost (< 1 query-length 5))
 
          ;; Dynamic Programming table
          (match-cache (make-hash-table :test 'eql :size 10))
-
-         ;; local variable to be used later
-         (indexes nil)
-         (hash-key 0)
-
-         ((symbol-function #'flx-get-matches-worker)
-          (lambda (greater-than q-index)
-            (or
-             (gethash
-              (setq hash-key (+ q-index
-                                (* (or greater-than 0)
-                                   query-length)))
-              match-cache)
-             (puthash
-              hash-key
-              (progn
-                (setq indexes (flx-bigger-sublist
-                               (gethash (aref query q-index) hash)
-                               greater-than))
-                (if (>= q-index (1- query-length))
-                    (mapcar (lambda (index)
-                              (cons (list index)
-                                    (cons (aref heatmap index) 0))) indexes)
-                  (let ((match) (best-score most-negative-fixnum))
-                    (dolist (index indexes (and match (list match)))
-                      (dolist (elem (flx-get-matches-worker index (1+ 
q-index)))
-                        (setq elem
-                          (cons (cons index (car elem))
-                                (cons
-                                 (+ (cadr elem)
-                                    (aref heatmap index)
-                                    (if (= (1- (caar elem)) index)
-                                        (+ (* (min (cddr elem)
-                                                   3)
-                                              15)
-                                           60)
-                                      0))
-                                 (if (= (1- (caar elem)) index)
-                                     (1+ (cddr elem))
-                                   0))))
-                        ;; we only care about the optimal score
-                        (when (> (cadr elem) best-score)
-                          (setq best-score (cadr elem)
-                                match elem)))))))
-              match-cache)))))
-
+         (res (flx-get-matches-worker nil 0
+                                      query-length heatmap match-cache 
str-info query)))
       ;; postprocess candidate
-      (let ((res (flx-get-matches-worker nil 0)))
-        (and res
-             (cons (+ (cadar res)
-                      (if (and full-match-boost
-                               (=  (length (caar res))
-                                   (length str)))
-                          10000
-                        0))
-                   (caar res)))))))
+      (and res
+         (cons (+ (cadar res)
+                  (if (and full-match-boost
+                         (=  (length (caar res))
+                             (length str)))
+                      10000
+                    0))
+               (caar res))))))
 
 (defun flx-propertize (obj score &optional add-score)
   "Return propertized copy of obj according to score.



reply via email to

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