Fixed-size thread pool returning Kotlin Results

Kotlin
import java.util.concurrent.Callable
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

fun <T> runPool(tasks: List<() -> T>, workers: Int = 4): List<Result<T>> {
    require(workers > 0) { "workers must be positive" }
    val pool = Executors.newFixedThreadPool(workers)
    return try {
        val futures = tasks.map { task -> pool.submit(Callable { runCatching { task() } }) }
        futures.map { it.get(30, TimeUnit.SECONDS) }
    } finally {
        pool.shutdownNow()
    }
}

val results = runPool(listOf({ 1 + 1 }, { error("boom") }))
println(results.map { it.getOrElse { e -> e.message } })