Effect.ts: Absence as First-Class

ResourcesLesson 21 of 51

21. acquireRelease - Resource Safety

When acquiring resources, ALWAYS specify how to clean up. Even if interrupted!

Code Example
const program = Effect.acquireRelease(
  // Acquire: get the absent resource
  Effect.gen(function* () {
    const conn = yield* openConnection();
    yield* Console.log("Connection opened");
    return conn;
  }),

  // Release: ALWAYS runs, even on error/interrupt
  (conn) => Effect.gen(function* () {
    yield* closeConnection(conn);
    yield* Console.log("Connection closed");
  })
).pipe(
  // Use the resource
  Effect.flatMap((conn) =>
    processData(conn)
  )
);

// Guarantees:
// 1. If acquire succeeds, release ALWAYS runs
// 2. Even if interrupted mid-processing
// 3. Even if processing fails
Interactive Example
let acquired = false;
let released = false;
const program = Effect.gen(function* () {
      return yield* Effect.acquireUseRelease(
              Effect.sync(() => { acquired = true; return 'connection'; }),
              (conn) => Effect.succeed('Used ' + conn),
              () => Effect.sync(() => { released = true; })
      );
});
const result = await Effect.runPromise(program);
return `Resource safety!

Acquired: ${acquired}
Used: ${result}
Released: ${released}

✓ Cleanup ALWAYS runs!`;
Explanation

acquireRelease: safely managing temporarily available resources.

Traditional approach: try/finally (but breaks on interruption). Effect types resource lifecycle as managed absence:

  • Connection is unavailable
  • Describe: "HOW to make it available (acquire)"
  • Describe: "HOW to make it unavailable again (release)"
  • No assumptions about process succeeding

Absence-first resource management: resources are temporarily resolving absence!


Part 21 of 51 in the Effect.ts Absence Modeling series