OCaml aligned plain-text table renderer
OCaml
let pad_right width text =
text ^ String.make (max 0 (width - String.length text)) ' '
let render headers rows =
let widths = Array.make (List.length headers) 0 in
let measure row =
List.iteri (fun i cell -> widths.(i) <- max widths.(i) (String.length cell)) row
in
measure headers;
List.iter measure rows;
let line row =
String.concat " | " (List.mapi (fun i cell -> pad_right widths.(i) cell) row)
in
let rule = String.concat "-+-" (Array.to_list (Array.map (fun w -> String.make w '-') widths)) in
String.concat "\n" (line headers :: rule :: List.map line rows)
let () =
print_endline (render [ "name"; "size" ] [ [ "notes.txt"; "12" ]; [ "a.ml"; "3" ] ])