F# aligned plain-text terminal table
F#
let renderTable (headers: string list) (rows: string list list) =
let widths =
headers :: rows
|> List.map (List.map String.length)
|> List.fold (List.map2 max) (headers |> List.map String.length)
let pad (s: string) width = s.PadRight(width)
let line cells =
List.map2 pad cells widths |> String.concat " | " |> sprintf "| %s |"
let rule =
widths |> List.map (fun w -> String.replicate w "-") |> String.concat "-+-" |> sprintf "+-%s-+"
(line headers :: rule :: List.map line rows)
|> String.concat "\n"
printfn "%s" (renderTable [ "id"; "name" ] [ [ "1"; "ada" ]; [ "22"; "grace" ] ])