Effect.ts: Absence as First-Class
Resources • Lesson 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