From e86a43d47108688d7412796fb03caa47f87279f0 Mon Sep 17 00:00:00 2001 From: Alex Kost Date: Wed, 18 Nov 2015 10:39:42 +0300 Subject: [PATCH] emacs: list: Generate numerical sort predicates. * emacs/guix-list.el: Generate predicates to sort tabulated list columns numerically. (guix-list-define-numerical-sorter) (guix-list-define-numerical-sorters): New macros (guix-list-column-format): Use 'guix-list-sort-numerically-0' for generation "Number" column. --- emacs/guix-list.el | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/emacs/guix-list.el b/emacs/guix-list.el index 6bb8571635..d6045d45cc 100644 --- a/emacs/guix-list.el +++ b/emacs/guix-list.el @@ -72,9 +72,7 @@ entries, he will be prompted for confirmation." (installed 12 t) (synopsis 30 nil)) (generation - (number 5 - ,(lambda (a b) (guix-list-sort-numerically 0 a b)) - :right-align t) + (number 5 guix-list-sort-numerically-0 :right-align t) (current 10 t) (time 20 t) (path 30 t))) @@ -143,12 +141,34 @@ non-nil, invert the sort." (defun guix-list-sort-numerically (column a b) "Compare COLUMN of tabulated entries A and B numerically. -It is a sort predicate for `tabulated-list-format'. +This function is used for sort predicates for `tabulated-list-format'. Return non-nil, if B is bigger than A." (cl-flet ((num (entry) (string-to-number (aref (cadr entry) column)))) (> (num b) (num a)))) +(defmacro guix-list-define-numerical-sorter (column) + "Define numerical sort predicate for COLUMN. +See `guix-list-sort-numerically' for details." + (let ((name (intern (format "guix-list-sort-numerically-%d" column))) + (doc (format "\ +Predicate to sort tabulated list by column %d numerically. +See `guix-list-sort-numerically' for details." + column))) + `(defun ,name (a b) + ,doc + (guix-list-sort-numerically ,column a b)))) + +(defmacro guix-list-define-numerical-sorters (n) + "Define numerical sort predicates for columns from 0 to N. +See `guix-list-define-numerical-sorter' for details." + `(progn + ,@(mapcar (lambda (i) + `(guix-list-define-numerical-sorter ,i)) + (number-sequence 0 n)))) + +(guix-list-define-numerical-sorters 9) + (defun guix-list-make-tabulated-vector (entry-type fun) "Call FUN on each column specification for ENTRY-TYPE.