guix-commits
[Top][All Lists]
Advanced

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

01/04: utils: Add a procedure for pretty printing tabular data.


From: guix-commits
Subject: 01/04: utils: Add a procedure for pretty printing tabular data.
Date: Thu, 15 Jul 2021 16:12:46 -0400 (EDT)

apteryx pushed a commit to branch master
in repository guix.

commit b73b9aae0d986b59f9b235788cfb758bf6b5411d
Author: Steve Sprang <scs@stevesprang.com>
AuthorDate: Tue Jan 9 14:00:11 2018 -0800

    utils: Add a procedure for pretty printing tabular data.
    
    * guix/utils.scm (pretty-print-table): New procedure.
    
    Co-authored-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
    Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
---
 guix/utils.scm | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/guix/utils.scm b/guix/utils.scm
index 05af86f..2c56c8b 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -10,6 +10,8 @@
 ;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
 ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
+;;; Copyright © 2018 Steve Sprang <scs@stevesprang.com>
+;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -123,7 +125,9 @@
             canonical-newline-port
 
             string-distance
-            string-closest))
+            string-closest
+
+            pretty-print-table))
 
 
 ;;;
@@ -935,6 +939,33 @@ according to THRESHOLD, then #f is returned."
            #f +inf.0
            tests)))
 
+
+;;;
+;;; Prettified output.
+;;;
+
+(define* (pretty-print-table rows #:key (max-column-width 20))
+  "Print ROWS in neat columns.  All rows should be lists of strings and each
+row should have the same length.  The columns are separated by a tab
+character, and aligned using spaces.  The maximum width of each column is
+bound by MAX-COLUMN-WIDTH."
+  (let* ((number-of-columns-to-pad (if (null? rows)
+                                       0
+                                       (1- (length (first rows)))))
+         ;; Ignore the last column as it is left aligned and doesn't need
+         ;; padding; this prevents printing extraneous trailing spaces.
+         (column-widths (fold (lambda (row maximums)
+                                (map max (map string-length row) maximums))
+                              ;; Initial max width is 0 for each column.
+                              (make-list number-of-columns-to-pad 0)
+                              (map (cut drop-right <> 1) rows)))
+         (column-formats (map (cut format #f "~~~da" <>)
+                              (map (cut min <> max-column-width)
+                                   column-widths)))
+         (fmt (string-append (string-join column-formats "\t") "\t~a")))
+    (setvbuf (current-output-port) 'block) ;for better performance
+    (for-each (cut format #t "~?~%" fmt <>) rows)))
+
 ;;; Local Variables:
 ;;; eval: (put 'call-with-progress-reporter 'scheme-indent-function 1)
 ;;; End:



reply via email to

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