From 213fed9f2da164f83498c904a2ec8140c75ebfcd Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Fri, 2 May 2025 10:30:58 -0400 Subject: [PATCH] wip: eio --- dune-project | 12 ++++++++++++ src/eio/dune | 5 +++++ src/eio/moonpool_eio.ml | 24 ++++++++++++++++++++++++ src/eio/moonpool_eio.mli | 4 ++++ 4 files changed, 45 insertions(+) create mode 100644 src/eio/dune create mode 100644 src/eio/moonpool_eio.ml create mode 100644 src/eio/moonpool_eio.mli diff --git a/dune-project b/dune-project index 7f1de178..6656281c 100644 --- a/dune-project +++ b/dune-project @@ -37,6 +37,18 @@ (tags (thread pool domain futures fork-join))) +(package + (name moonpool-eio) + (synopsis "Compatibility layer between moonpool and Eio") + (allow_empty) ; on < 5.0 + (depends + (moonpool (= :version)) + (ocaml (>= 5.0)) + eio + (trace :with-test) + (trace-tef :with-test) + (odoc :with-doc))) + (package (name moonpool-lwt) (synopsis "Event loop for moonpool based on Lwt-engine (experimental)") diff --git a/src/eio/dune b/src/eio/dune new file mode 100644 index 00000000..839c7953 --- /dev/null +++ b/src/eio/dune @@ -0,0 +1,5 @@ +(library + (name moonpool_eio) + (public_name moonpool-eio) + (synopsis "compatibility layer between moonpool and eio") + (libraries moonpool eio)) diff --git a/src/eio/moonpool_eio.ml b/src/eio/moonpool_eio.ml new file mode 100644 index 00000000..7ca64d4b --- /dev/null +++ b/src/eio/moonpool_eio.ml @@ -0,0 +1,24 @@ +let fut_of_moonpool (fut : 'a Moonpool.Fut.t) : 'a Eio.Promise.or_exn = + match Moonpool.Fut.peek fut with + | Some (Ok r) -> Eio.Promise.create_resolved @@ Ok r + | Some (Error (exn, _bt)) -> + let prom, resolver = Eio.Promise.create () in + Eio.Promise.resolve_error resolver exn; + prom + | None -> + let prom, resolver = Eio.Promise.create () in + Moonpool.Fut.on_result fut (function + | Ok r -> Eio.Promise.resolve_ok resolver r + | Error (exn, _) -> Eio.Promise.resolve_error resolver exn); + prom + +let await_moonpool (fut : 'a Moonpool.Fut.t) : 'a = + match Moonpool.Fut.peek fut with + | Some (Ok r) -> r + | Some (Error (exn, bt)) -> Printexc.raise_with_backtrace exn bt + | None -> + let prom, resolver = Eio.Promise.create () in + Moonpool.Fut.on_result fut (function + | Ok r -> Eio.Promise.resolve_ok resolver r + | Error (exn, _) -> Eio.Promise.resolve_error resolver exn); + Eio.Promise.await_exn prom diff --git a/src/eio/moonpool_eio.mli b/src/eio/moonpool_eio.mli new file mode 100644 index 00000000..56ab6459 --- /dev/null +++ b/src/eio/moonpool_eio.mli @@ -0,0 +1,4 @@ +val fut_of_moonpool : 'a Moonpool.Fut.t -> 'a Eio.Promise.or_exn + +val await_moonpool : 'a Moonpool.Fut.t -> 'a +(** Await a moonpool future *)