# Monadic abstraction for using Eio Executor pool

**URL:** <https://discuss.ocaml.org/t/monadic-abstraction-for-using-eio-executor-pool/18473>\
**Category:** Community\
**Tags:** monads, eio\
**Created:** [August 25, 2026, 1:30pm UTC](https://discuss.ocaml.org/t/monadic-abstraction-for-using-eio-executor-pool/18473 "2026-08-25T13:30:42Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![dbuenzli](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/dbuenzli/32/18_2.png) [@dbuenzli](https://discuss.ocaml.org/u/dbuenzli)\
**Post date:** [August 25, 2026, 2:16pm UTC](https://discuss.ocaml.org/t/monadic-abstraction-for-using-eio-executor-pool/18473/2 "2026-08-25T14:16:27Z")

</div>

> [@kentookura](#):
>
> Is there anything about this that screams “bad idea”?

I gather you are working in the constraints of eio. But to me it just screams bureaucracy and wrong abstractions. Just for fun I tried to write your example with the newly released [affect](https://discuss.ocaml.org/t/ann-affect-0-0-0-a-streamlined-and-natural-concurrency-model-for-ocaml) library, here’s the result:

```auto
open Affect

let count_primes n = …
let timed_count_primes n = … 

let main () =
  Fun.Async.main ~domain_count:2 @@ fun () ->
  let start = Unix.gettimeofday () in
  let task_a = Fun.Async.call (fun () -> timed_count_primes 2_000_000) in
  let task_b = Fun.Async.call (fun () -> timed_count_primes 2_000_000) in
  let a, time_a = Fun.Async.get task_a in
  let b, time_b = Fun.Async.get task_b in
  let total, sequential_estimate = a + b, time_a +. time_b in
  let elapsed = Unix.gettimeofday () -. start in
  if elapsed < sequential_estimate *. 0.75
  then Format.printf "It's fast!@."

let () = if !Sys.interactive then () else main ()

```

---

_[View the full topic](https://discuss.ocaml.org/t/monadic-abstraction-for-using-eio-executor-pool/18473)._
