Effect.ts: Absence as First-Class

Data TypesLesson 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