If the task is small enough you may not want to dispatch it to the thread pool.
In those cases it would be nice if you could simply create a promise that's already fulfilled, so that code that runs await on it can work in either case.
Supposing we can have a Task.return that creates a fulfilled promise, here's a contrived example:
let work, worklen = get_work () in
let changes =
(* skip dispatching to pool if workload is small *)
if worklen < 3
then List.map work ~f:(fun x -> Task.return pool (thunk_opt x))
else List.map work ~f:(fun x -> Task.async pool (fun () -> thunk_opt x)))
in
List.fold_left changes ~init:[] ~f:(fun acc res ->
match Task.await pool res with
| None -> acc
| Some y -> y :: acc)