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" ] ])