Aligned plain-text table renderer for the terminal

Kotlin
fun renderTable(headers: List<String>, rows: List<List<String>>): String {
    val widths = headers.indices.map { col ->
        (rows.map { it.getOrElse(col) { "" } } + headers[col]).maxOf { it.length }
    }
    fun line(values: List<String>) = values
        .mapIndexed { i, v -> v.padEnd(widths[i]) }
        .joinToString(" | ", "| ", " |")
    val out = StringBuilder()
    out.appendLine(line(headers))
    out.appendLine(widths.joinToString("+", "+", "+") { "-".repeat(it + 2) })
    rows.forEach { out.appendLine(line(it)) }
    return out.toString()
}

val table = renderTable(listOf("id", "name"), listOf(listOf("1", "kotlin"), listOf("22", "c")))
print(table)