OCaml bounded worker pool using Domain.spawn

OCaml
let run_pool ~workers tasks =
  if workers < 1 then invalid_arg "run_pool: workers must be positive";
  let tasks = Array.of_list tasks in
  let next = Atomic.make 0 in
  let worker () =
    let rec loop acc =
      let i = Atomic.fetch_and_add next 1 in
      if i >= Array.length tasks then List.rev acc
      else loop ((try Ok (tasks.(i) ()) with exn -> Error exn) :: acc)
    in
    loop []
  in
  List.init workers (fun _ -> Domain.spawn worker)
  |> List.map Domain.join
  |> List.concat