Effect.ts: Absence as First-Class

State ManagementLesson 33 of 51

33. Queue Strategies - Handling Full/Empty

Different HOWs when queue is full or empty

Code Example
// Strategy: Bounded queue (block when full)
const bounded = Queue.bounded<number>(3);
// 4th offer WAITS for space

// Strategy: Dropping (drop new when full)
const dropping = Queue.dropping<number>(3);
// 4th offer is IGNORED

// Strategy: Sliding (drop old when full)
const sliding = Queue.sliding<number>(3);
// 4th offer REMOVES oldest

// Empty strategies:
Queue.take(queue);      // WAITS for item
Queue.poll(queue);      // Returns Option.none() immediately
Queue.takeUpTo(queue, 5); // Takes what's available

// Same absence, different HOWs!
Interactive Example
const { Queue } = await import('effect');
const bounded = await Effect.runPromise(Queue.bounded(2));
const dropping = await Effect.runPromise(Queue.dropping(2));
const sliding = await Effect.runPromise(Queue.sliding(2));
return `Queue strategies!

Bounded(2): Blocks when full
- offer #3 waits for space

Dropping(2): Drops new items
- offer #3 ignored

Sliding(2): Drops old items  
- offer #3 removes oldest

Different absence strategies!`;
Explanation

Queue strategies: different HOWs for handling absence limits.

Traditional approach: one strategy (usually blocking). Queue types multiple absence-handling strategies:

Full queue = "capacity for new values is absent":

  • Bounded: wait for capacity to appear
  • Dropping: accept that new values will be absent
  • Sliding: make old values absent to create capacity

Empty queue = "values are absent":

  • take: wait for values to appear
  • poll: acknowledge immediate absence (None)
  • takeUpTo: take whatever presence exists

Absence-first resource limits!


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