Note that this is very close to the effect that Eio defines already:
type 'a enqueue = ('a, exn) result -> unit
type _ eff +=
Suspend : (Fibre_context.t -> 'a enqueue -> unit) -> 'a eff
The two differences are:
- We allow the operation to discontinue with an exception.
- We share a fibre context, allowing cancellation.
The idea with cancellation is that you can call set_cancel_fn to attach a function that cancels the operation to the fibre’s context. If the user cancels (e.g. a timeout happens), this function will be called.
When your operation finishes, you call clear_cancel_fn
to remove it again. If that returns true
then you have removed the unused cancellation function and can enqueue the operation’s result. If it returns false
then the operation was cancelled concurrently and you should do nothing.