( acquire: Effect.Effect<A, E, R>, use: (a: A) => Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>, release: (a: A, exit: Exit.Exit<OutDone, OutErr>) => Effect.Effect<unknown> )
| 579 | * @since 2.0.0 |
| 580 | */ |
| 581 | export const acquireUseRelease = <A, E, R, OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>( |
| 582 | acquire: Effect.Effect<A, E, R>, |
| 583 | use: (a: A) => Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>, |
| 584 | release: (a: A, exit: Exit.Exit<OutDone, OutErr>) => Effect.Effect<unknown> |
| 585 | ): Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R> => |
| 586 | fromTransformBracket( |
| 587 | Effect.fnUntraced(function*(upstream, scope, forkedScope) { |
| 588 | let option = Option.none<A>() |
| 589 | yield* Scope.addFinalizerExit(forkedScope, (exit) => |
| 590 | Option.isSome(option) |
| 591 | ? release(option.value, exit as any) |
| 592 | : Effect.void) |
| 593 | const value = yield* Effect.uninterruptible(acquire) |
| 594 | option = Option.some(value) |
| 595 | return yield* toTransform(use(value))(upstream, scope) |
| 596 | }) |
| 597 | ) |
| 598 | |
| 599 | /** |
| 600 | * Acquires a resource, emits the acquired value as a single channel element, |
no test coverage detected