[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)