Effect.ts: Absence as First-Class

ConcurrencyLesson 12 of 51

12. Bounded Concurrency

Control HOW MANY absences to resolve at once

Code Example
const users = Array.from(
  { length: 100 },
  (_, i) => `user${i}`
);

const processUser = (id) =>
  Effect.succeed(`Processed ${id}`);

// HOW: Only 5 at a time
const batched = Effect.forEach(
  users,
  processUser,
  { concurrency: 5 }  // ← THE HOW
);

// Processes in batches of 5
Interactive Example
const users = ['user1', 'user2', 'user3', 'user4', 'user5', 'user6', 'user7', 'user8'];
let concurrent = 0;
let maxConcurrent = 0;
const processUser = (id) => Effect.gen(function* () {
      concurrent++;
      maxConcurrent = Math.max(maxConcurrent, concurrent);
      yield* Effect.sleep('50 millis');
      concurrent--;
      return "Processed " + id;
});
const start = Date.now();
await Effect.runPromise(
      Effect.forEach(users, processUser, { concurrency: 3 })
);
const elapsed = Date.now() - start;
return `Bounded concurrency!

8 users processed
Max concurrent: ${maxConcurrent} (limited to 3)
Total time: ~${elapsed}ms

✓ Controlled parallelism!`;
Explanation

Bounded concurrency: controlling absence resolution rate.

Traditional approach: process all at once (overwhelm system) or one at a time (too slow). Effect types unavailability with controlled parallelism:

  • 100 users are unavailable (need processing)
  • No assumptions about system capacity
  • Describe: "Resolve 5 absences at a time, no more"

This is absence-first resource management!


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