Effect.ts: Absence as First-Class
Data Types • Lesson 40 of 51
40. Scope - Lifetime Management
Scope models HOW LONG resources should exist
Code Example
// Scope: "resources are absent until acquired,
// and become absent again when scope closes"
const program = Effect.gen(function* () {
// Create a scope for resource lifetime
const scope = yield* Scope.make();
// Acquire resource - it exists within scope
const resource = yield* acquireResource().pipe(
Effect.onExit(() => Console.log("Cleanup!"))
).pipe(
Scope.extend(scope)
);
// Use resource (it exists!)
yield* useResource(resource);
// Close scope - resource becomes absent again
yield* Scope.close(scope, Exit.void);
// "Cleanup!" logged - resource released
});
Interactive Example
const output: string[] = [];
output.push('Scope manages resource lifetime:');
output.push('');
output.push('1. Scope.make() → Create scope');
output.push('2. acquire().pipe(Scope.extend(scope))');
output.push('3. Use resource...');
output.push('4. Scope.close() → Cleanup!');
output.push('');
output.push('Resources exist only within scope.');
output.push('');
output.push(' Explicit lifetime management!');
return output.join('
');
Explanation
Scope: explicitly modeling resource lifetime (when things exist).
Traditional approach: try/finally, hope you clean up. Scope types resource existence period:
- Resources are absent
- Scope: "period during which resources exist"
- extend: "tie resource lifetime to scope"
- close: "make all scoped resources absent again"
- No assumptions about cleanup order
Absence-first lifecycle: resources have typed existence periods!
Part 40 of 51 in the Effect.ts Absence Modeling series