-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrender_table.ml
More file actions
45 lines (39 loc) · 1.06 KB
/
render_table.ml
File metadata and controls
45 lines (39 loc) · 1.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
open Base;;
open Stdio;;
let max_widths header rows =
let lengths l = List.map ~f:String.length l in
List.fold rows
~init:(lengths header)
~f:(fun acc row ->
List.map2_exn ~f:Int.max acc (lengths row))
;;
let render_separator widths =
let pieces = List.map widths
~f:(fun w -> String.make (w + 2) '-')
in
"|" ^ String.concat ~sep:"+" pieces ^ "|"
;;
let pad s length =
" " ^ s ^ String.make (length - String.length s + 1) ' '
;;
let render_row row widths =
let padded = List.map2_exn row widths ~f:pad in
"|" ^ String.concat ~sep:"|" padded ^ "|"
;;
let render_table header rows =
let widths = max_widths header rows in
String.concat ~sep:"\n"
(render_row header widths
:: render_separator widths
:: List.map rows ~f:(fun row -> render_row row widths)
)
;;
Stdio.print_endline
(render_table
["language";"architect";"first release"]
[ ["Lisp" ;"John McCarthy" ;"1958"] ;
["C" ;"Dennis Ritchie";"1969"] ;
["ML" ;"Robin Milner" ;"1973"] ;
["OCaml";"Xavier Leroy" ;"1996"] ;
])
;;