Haskell aligned plain-text table renderer
Haskell
import Data.List (intercalate, transpose)
data Align = L | R
renderTable :: [Align] -> [[String]] -> String
renderTable _ [] = ""
renderTable aligns rows@(header : body) = unlines (line header : divider : map line body)
where
widths = map (maximum . map length) (transpose rows)
line cells = intercalate " | " (zipWith3 pad aligns widths cells)
divider = intercalate "-+-" (map (\w -> replicate w '-') widths)
pad L w s = s ++ replicate (w - length s) ' '
pad R w s = replicate (w - length s) ' ' ++ s