Hyperlinkv0.8.0-beta.28

Effect

Effect.ensuringconsteffect/Effect.ts:6777
<X, R1>(finalizer: Effect<X, never, R1>): <A, E, R>(
  self: Effect<A, E, R>
) => Effect<A, E, R1 | R>
<A, E, R, X, R1>(
  self: Effect<A, E, R>,
  finalizer: Effect<X, never, R1>
): Effect<A, E, R1 | R>

Returns an effect that, if this effect starts execution, then the specified finalizer is guaranteed to be executed, whether this effect succeeds, fails, or is interrupted.

Details

For use cases that need access to the effect's result, see onExit.

Finalizers offer very powerful guarantees, but they are low-level, and should generally not be used for releasing resources. For higher-level logic built on ensuring, see the acquireRelease family of methods.

Example (Always running cleanup)

import { Console, Effect } from "effect"

const task = Effect.gen(function*() {
  yield* Console.log("Task started")
  yield* Effect.sleep("1 second")
  yield* Console.log("Task completed")
  return 42
})

// Ensure cleanup always runs, regardless of success or failure
const program = Effect.ensuring(
  task,
  Console.log("Cleanup: This always runs!")
)

Effect.runPromise(program).then(console.log)
// Output:
// Task started
// Task completed
// Cleanup: This always runs!
// 42
resource management
Source effect/Effect.ts:67779 lines
export const ensuring: {
  <X, R1>(
    finalizer: Effect<X, never, R1>
  ): <A, E, R>(self: Effect<A, E, R>) => Effect<A, E, R1 | R>
  <A, E, R, X, R1>(
    self: Effect<A, E, R>,
    finalizer: Effect<X, never, R1>
  ): Effect<A, E, R1 | R>
} = internal.ensuring
Referenced by 3 symbols