branch: externals/repology commit 0137fbfce3d6c3b344e6d3414b66aec10935445e Author: Nicolas Goaziou <m...@nicolasgoaziou.fr> Commit: Nicolas Goaziou <m...@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)