Login

tee/Format

Tabulation boxes

type user = {
  name : string;
  age : int;
  city : string;
}

let users =
  [
    {name = "Alice"; age = 20; city = "Paris"};
    {name = "Bob"; age = 30; city = "London"};
  ]

let pp_users fmt list =
  let open Format in
  pp_open_tbox fmt ();
  pp_set_tab fmt ();
  fprintf fmt "%-7s" "Name";
  pp_set_tab fmt ();
  fprintf fmt "%-5s" "Age";
  pp_set_tab fmt ();
  fprintf fmt "%-5s" "City";

  ["-"; "-"; "-"]
  |> List.iter (fun s ->
      pp_print_tab fmt ();
      pp_print_string fmt s);

  List.iter
    (fun p ->
      pp_print_tab fmt ();
      fprintf fmt "%s" p.name;
      pp_print_tab fmt ();
      fprintf fmt "%d" p.age;
      pp_print_tab fmt ();
      fprintf fmt "%s" p.city)
    list;
  for i = 0 to 10 do
    pp_print_tab fmt ();
    pp_print_int fmt i
  done

let () = Format.printf "@[<v>%a@]@." pp_users users

(* do tables myself: *)

let () = print_newline ()

let pp_users fmt list =
  let open Format in
  fprintf fmt "@[<v>@[%10s%5s%10s@]@," "Name" "Age" "City";
  List.iter (fun p -> fprintf fmt "@[%10s%5d%10s@]@," p.name p.age p.city) list;
  fprintf fmt "@]"

let () = Format.printf "@[%a@]@." pp_users users

Output:

Name   Age  City 
-      -    -
Alice  20   Paris
Bob    30   London
0      1    2
3      4    5
6      7    8
9      10

      Name  Age      City
     Alice   20     Paris
       Bob   30    London