Lua coroutine worker pool with error capture

Lua
local function worker_pool(jobs, size, handle)
  local results, errors, n = {}, {}, 0
  local function worker()
    while n < #jobs do
      local i = n + 1; n = i
      local ok, res = pcall(handle, jobs[i], i)
      if ok then results[i] = res else errors[i] = tostring(res) end
      coroutine.yield()
    end
  end
  local cos = {}
  for i = 1, math.min(size or 4, #jobs) do cos[i] = coroutine.create(worker) end
  local running = #cos > 0; while running do
    running = false
    for i = 1, #cos do
      coroutine.resume(cos[i])
      running = running or coroutine.status(cos[i]) ~= 'dead'
    end
  end
  return results, errors
end
return worker_pool