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