/** * @tsplus static effect/core/stream/Channel.Ops acquireUseReleaseExit */ export function acquireUseReleaseExit< Env, InErr, InElem, InDone, OutErr, OutElem1, OutDone, Acquired >( acquire: Effect, use: (a: Acquired) => Channel, release: (a: Acquired, exit: Exit) => Effect ): Channel { return Channel.fromEffect( Ref.make<(exit: Exit) => Effect>((_) => Effect.unit) ).flatMap((ref) => Channel.fromEffect( acquire .tap((a) => ref.set((exit) => release(a, exit))) .uninterruptible ) .flatMap(use) .ensuringWith((exit) => ref.get.flatMap((f) => f(exit))) ) }