/** * Imports an asynchronous effect into a pure `Effect` value. This formulation * is necessary when the effect is itself expressed in terms of an `Effect`. * * @tsplus static effect/core/io/Effect.Ops asyncEffect */ export function asyncEffect( register: (callback: (_: Effect) => void) => Effect ): Effect { return Do(($) => { const deferred = $(Deferred.make()) const runtime = $(Effect.runtime()) return $( Effect.uninterruptibleMask(({ restore }) => restore( register((k) => runtime.unsafeRunAsync(k.intoDeferred(deferred))) .catchAllCause((cause) => deferred.failCause(cause as Cause)) ) .fork .zipRight(restore(deferred.await)) ) ) }) }