;;; -*- Mode:LISP; Package:USER; Base:10; Readtable:CL -*-

;;; Versions that accept &rest args of strings

(defun fill-strings(size &rest strings)
  (let*((spacel (ncons #\space)))
    (mapcar #'(lambda(s)
		(fillarray (make-string size)
			   (append
			     (map 'list #'char-int s)
			     spacel)))
	    strings)))

(defun fill-strings-max (&rest strings)
  (apply #'fill-strings (apply #'max (mapcar #'string-length strings))
	 strings))

(defun fill-strings-min (&rest strings)
  (apply #'fill-strings (apply #'min (mapcar #'string-length strings))
	 strings))

(defun fill-strings-from-first(string1 &rest strings)
  (apply #'fill-strings (string-length string1)
	 string1
	 strings))

;;; Versions that require arg of list of strings

(defun fill-list-strings(size strings)
  (apply #'fill-strings size strings))

(defun fill-list-strings-max (strings)
  (funcall #'fill-list-strings
	   (apply #'max (mapcar #'string-length strings))
	   strings))

(defun fill-list-strings-min (strings)
  (funcall #'fill-list-strings
	   (apply #'min (mapcar #'string-length strings))
	   strings))

(defun fill-list-strings-from-first(strings)
  (when (car strings)
    (funcall #'fill-list-strings
	     (string-length (car strings))
	     strings)))

;;; Friendly printing utilities for filled columns of strings

(defun line-print-filled-strings(strings &optional (stream standard-output) (fmt "~&~a"))
  (dolist(str strings)
    (format stream fmt str)))

(defun column-print-filled-strings(strings &optional (stream standard-output))
  (line-print-filled-strings strings stream "~&|~a|"))

(defun column-print-strings(strings &optional (mode :max) (stream standard-output))
  "Mode can be :MAX, :MIN, :FIRST, or a fixnum size"
  (column-print-filled-strings
    (cond
      ((eq mode :max) (fill-list-strings-max strings))
      ((eq mode :min) (fill-list-strings-min strings))
      ((eq mode :first) (fill-list-strings-from-first strings))
      ((fixnump mode) (fill-list-strings mode strings))
      (t (ferror "Invalid mode = ~s" mode)))
    stream))

