Effect.ts: Absence as First-Class

StreamsLesson 16 of 51

16. Streams - Multiple Values Over Time

Effect handles single values. Stream handles MANY values over time - like arrays that arrive incrementally

Code Example
// Effect: one value
const singleUser: Effect<User> = getUser("123");

// Stream: many values
const allUsers: Stream<User> = Stream.fromIterable([
  user1, user2, user3, /* ...millions */
]);

// Stream is Effect extended to N values!
// Effect<A, E, R>        = 0 or 1 value
// Stream<A, E, R>        = 0 to infinity values

const process = Stream.fromIterable([1, 2, 3, 4, 5])
  .pipe(
    Stream.map(n => n * 2),
    Stream.filter(n => n > 5),
    Stream.take(2)
  );
Interactive Example
const { Stream } = await import('effect');
const numbers = Stream.fromIterable([1, 2, 3, 4, 5]);
const doubled = numbers.pipe(
      Stream.map(n => n * 2),
      Stream.filter(n => n > 5)
);
const result = await Effect.runPromise(Stream.runCollect(doubled));
const resultArray = Array.from(result);
return `Stream processing!

Input: [1, 2, 3, 4, 5]
Double: [2, 4, 6, 8, 10]
Filter >5: [${resultArray.join(', ')}]

Multiple values over time!`;
Explanation

Streams: absence of MULTIPLE values over time.

Traditional approach: assume all data is in memory (arrays). Effect Stream types unavailability of sequential data:

  • Single user: unavailable (Effect)
  • All users: unavailable ONE AT A TIME (Stream)
  • No assumptions about how many or when they arrive

Absence-first for sequences! Each item is unavailable until yielded.


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