Effect.ts: Absence as First-Class

Advanced PatternsLesson 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