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

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

[elpa] externals/repology 0137fbf 2/3: Simplify sorting tools customizat


From: Nicolas Goaziou
Subject: [elpa] externals/repology 0137fbf 2/3: Simplify sorting tools customization
Date: Tue, 19 Jan 2021 04:00:32 -0500 (EST)

branch: externals/repology
commit 0137fbfce3d6c3b344e6d3414b66aec10935445e
Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
Commit: Nicolas Goaziou <mail@nicolasgoaziou.fr>

    Simplify sorting tools customization
    
    * repology-utils.el (repology-display-sort-column): Remove macro.
    (repology-compare-texts):
    (repology-compare-numbers): Remove functions.
    (repology--display-sort-generic):
    (repology-display-sort-numbers):
    (repology-display-sort-texts):
    (repology-display-sort-versions): New functions.
    * repology.el (repology-display-packages-columns):
    (repology-display-projects-columns):
    (repology-display-projects-default): Use new functions.
---
 repology-utils.el | 63 +++++++++++++++++++++++++++++--------------------------
 repology.el       | 25 ++++++++++------------
 2 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/repology-utils.el b/repology-utils.el
index 85f935c..5ef6c25 100644
--- a/repology-utils.el
+++ b/repology-utils.el
@@ -27,26 +27,6 @@
 ;;; Code:
 
 
-;;; Macro
-
-;; XXX: We need it to be a macro because it is required early, e.g.,
-;; in `repology-display-packages-columns'.
-(defmacro repology-display-sort-column (name predicate)
-  "Return a function comparing entries in column NAME.
-NAME is a string.  Compare entries using function PREDICATE, called on two
-objects of the column."
-  `(lambda (e1 e2)
-     (let ((column
-            ;; Find column's number
-            (or (seq-position tabulated-list-format
-                              ,name
-                              (pcase-lambda (`(,n . ,_) s) (equal n s)))
-                (error "Invalid column name %S" ,name))))
-       (let ((s1 (elt (cadr e1) column))
-             (s2 (elt (cadr e2) column)))
-         (funcall ,predicate s1 s2)))))
-
-
 ;;; Packages
 (defun repology-package-p (object)
   "Return t if OBJECT is a package."
@@ -387,16 +367,39 @@ V1 and V2 are strings."
       nil)))
 
 
-;;; Other Comparisons
-(defun repology-compare-texts (s1 s2)
-  "Compare strings S1 and S2 in collation order.
-Return t if S1 is less than S2.  Case is ignored."
-  (string-collate-lessp s1 s2 nil t))
-
-(defun repology-compare-numbers (s1 s2)
-  "Compare strings S1 and S2 numerically.
-Return t if S1 is less than S2."
-  (< (string-to-number s1) (string-to-number s2)))
+;;; Sort Functions
+(defun repology--display-sort-generic (e1 e2 predicate)
+  "Compare entries E1 and E2 according to PREDICATE.
+E1 and E2 are elements of `tabulated-list-entries'.  PREDICATE is called on the
+values from E1 and E2 at the column being sorted."
+  (let ((column
+         ;; Find number of column being sorted.
+         (seq-position tabulated-list-format
+                       (car tabulated-list-sort-key)
+                       (pcase-lambda (`(,n . ,_) s) (equal n s)))))
+    ;; Call PREDICATE on values instead of entries.
+    (let ((val1 (elt (cadr e1) column))
+          (val2 (elt (cadr e2) column)))
+      (funcall predicate val1 val2))))
+
+(defun repology-display-sort-numbers (e1 e2)
+  "Return t if E1 is numerically less than E2.
+E1 and E2 are elements of `tabulated-list-entries'."
+  (repology--display-sort-generic
+   e1 e2
+   (lambda (s1 s2) (< (string-to-number s1) (string-to-number s2)))))
+
+(defun repology-display-sort-texts (e1 e2)
+  "Return t if E1 is before E2, in collation order.
+E1 and E2 are elements of `tabulated-list-entries'.  Case is ignored."
+  (repology--display-sort-generic
+   e1 e2
+   (lambda (s1 s2) (string-collate-lessp s1 s2 nil t))))
+
+(defun repology-display-sort-versions (e1 e2)
+  "Return t if E1 is older than E2.
+E1 and E2 are elements of `tabulated-list-entries'."
+  (repology--display-sort-generic e1 e2 #'repology-version-<))
 
 
 (provide 'repology-utils)
diff --git a/repology.el b/repology.el
index 6f42ecb..c90295c 100644
--- a/repology.el
+++ b/repology.el
@@ -200,15 +200,15 @@ problem argument.  Its return value is then turned into a 
string and displayed."
                   (function :tag "Custom sort predicate")))))
 
 (defcustom repology-display-packages-columns
-  `(("Repository"
+  '(("Repository"
      repology-package-repository-full-name
      20
-     ,(repology-display-sort-column "Repository" #'repology-compare-texts))
+     repology-display-sort-texts)
     ("Name" visiblename 20 t)
     ("Version"
      repology-package-colorized-version
      12
-     ,(repology-display-sort-column "Version" #'repology-version-<))
+     repology-display-sort-versions)
     ("Category" categories 25 t)
     ("Maintainer(s)" maintainers 30 t))
   "Columns format rules used to display a list of packages.
@@ -224,9 +224,9 @@ package argument.  Its return value will be turned into a 
string and displayed.
 This library provides a few functions useful as VALUE.  See, for example,
 `repology-package-repository-full-name' or 
`repology-package-colorized-version'.
 
-You may also want to look into `repology-display-sort-column', along with
-predicates like `repology-compare-texts', `repology-compare-numbers', or
-`repology-version-<' in order to build SORT values."
+You may also want to look into comparison functions suitable for SORT, such as
+`repology-display-sort-numbers', `repology-display-sort-texts', and
+`repology-display-sort-versions'."
   :type
   `(repeat
     (list :tag "Column definition"
@@ -257,9 +257,9 @@ of the above form.
 This library provides a few functions useful as VALUE.  See, for example,
 `repology-project-newest-version' or `repology-project-outdated-versions'.
 
-You may also want to look into `repology-display-sort-column', along with
-predicates like `repology-compare-texts', `repology-compare-numbers', or
-`repology-version-<' in order to build SORT values."
+You may also want to look into comparison functions suitable for SORT, such as
+`repology-display-sort-numbers', `repology-display-sort-texts', and
+`repology-display-sort-versions'."
   :type '(choice
           (repeat
            (list :tag "Column definition"
@@ -708,11 +708,8 @@ or nil.  This is the default value for 
`repology-display-projects-columns'."
     ("#"
      (lambda (p) (length (repology-project-packages p)))
      5
-     ,(repology-display-sort-column "#" #'repology-compare-numbers))
-    ("Newest"
-     repology-project-newest-version
-     12
-     ,(repology-display-sort-column "Newest" #'repology-version-<))
+     repology-display-sort-numbers)
+    ("Newest" repology-project-newest-version 12 
repology-display-sort-versions)
     ("Outdated" repology-project-outdated-versions 30 nil)))
 
 (defun repology-display-package (package)



reply via email to

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