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