Effect.ts: Absence as First-Class
Advanced Patterns • Lesson 42 of 51
42. Batching - Accumulating Absent Requests
Collect many requests for absent data, resolve in one batch
Code Example
// Individual requests for users (each absent)
const getUser = (id: string): Effect<User, Error> => {
// Expensive: separate DB call per user!
return Effect.promise(() => db.query(id));
};
// Batching: accumulate absent requests
const getUserBatched = (id: string) =>
Effect.gen(function* () {
// Collect requests for 50ms window
const users = yield* Effect.batch(
getUsersBatch, // Batched fetcher
[id], // This request
{ window: "50 millis" }
);
return users.get(id);
});
// 100 individual requests → 1 batch query!
Interactive Example
const output: string[] = [];
output.push('Batching requests:');
output.push('');
output.push('Without batching:');
output.push(' 100 requests → 100 DB calls');
output.push('');
output.push('With batching:');
output.push(' 100 requests → 1 DB call');
output.push(' (accumulated over 50ms window)');
output.push('');
output.push(' N requests → 1 batch!');
return output.join('
');
Explanation
Batching: accumulating absence resolution requests.
Traditional approach: N requests = N database calls. Effect.batch types accumulated absence:
- 100 users are absent individually
- Wait 50ms to accumulate requests
- No assumptions about request timing
- Describe: "resolve all these absences together"
- 1 batch call instead of 100!
Absence-first efficiency: batch absence resolution!
Part 42 of 51 in the Effect.ts Absence Modeling series