Hyperlinkv0.8.0-beta.28

Channel

Channel.acquireUseReleaseconsteffect/Channel.ts:564
<A, E, R, OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
  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>
): Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>

Acquires a resource, uses it to build a Channel, and guarantees that release runs with the channel's Exit when the channel completes, fails, or is interrupted.

Details

Acquisition is uninterruptible. If acquisition fails, use is not run and release is not registered.

Example (Managing resources with acquire-use-release)

import { Channel, Effect } from "effect"

const channel = Channel.acquireUseRelease(
  Effect.succeed("resource"),
  (resource) => Channel.succeed(resource.toUpperCase()),
  (resource, exit) => Effect.log(`Released: ${resource}`)
)
constructors
Source effect/Channel.ts:56417 lines
export const acquireUseRelease = <A, E, R, OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
  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>
): Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R> =>
  fromTransformBracket(
    Effect.fnUntraced(function*(upstream, scope, forkedScope) {
      let option = Option.none<A>()
      yield* Scope.addFinalizerExit(forkedScope, (exit) =>
        Option.isSome(option)
          ? release(option.value, exit as any)
          : Effect.void)
      const value = yield* Effect.uninterruptible(acquire)
      option = Option.some(value)
      return yield* toTransform(use(value))(upstream, scope)
    })
  )