ZIO<R, E, A>.asyncInterrupt constructor

ZIO<R, E, A>.asyncInterrupt(
  1. IO<Unit> f(
    1. AsyncContext<E, A> $
    )
)

Implementation

factory ZIO.asyncInterrupt(IO<Unit> Function(AsyncContext<E, A> $) f) =>
    ZIO.from((ctx) {
      final context = AsyncContext<E, A>();
      final finalizer = f(context);
      if (context._deferred.unsafeCompleted) {
        return context._deferred.await().unsafeRun(ctx);
      }

      final interuption =
          ctx.signal.await<R>().alwaysIgnore(finalizer.lift());

      return context._deferred
          .await<R>()
          .race(interuption)
          .unsafeRun(ctx.withoutSignal);
    });