Effect.ts: Absence as First-Class
Validation • Lesson 37 of 51
37. Schema + Effect - Parsing Pipelines
Combine validation (Schema) with execution (Effect)
Code Example
const UserSchema = Schema.Struct({
id: Schema.Number,
email: Schema.String
});
const program = Effect.gen(function* () {
// Fetch: data is absent (on server)
const response = yield* fetchUserAPI("123");
// Decode: data might be invalid (still absent!)
const user = yield* Schema.decode(UserSchema)(response);
// ^^^^^^^^^^^^
// Effect<User, ParseError>
// Only here do we have VALIDATED data
yield* saveToDatabase(user);
return user;
}).pipe(
Effect.catchAll((error) =>
Effect.succeed({ id: 0, email: "guest@example.com" })
)
);
Interactive Example
const output: string[] = [];
output.push('Schema + Effect pipeline:');
output.push('');
output.push('1. fetchAPI() → Effect<unknown>');
output.push('2. Schema.decode() → Effect<User, ParseError>');
output.push('3. saveDB() → Effect<void, DbError>');
output.push('');
output.push('Composition:');
output.push(' fetch → validate → save');
output.push('');
output.push(' Layered absence resolution!');
return output.join('
');
Explanation
Schema + Effect: layered absence resolution.
Traditional approach:
- Fetch (assume works)
- Parse (assume valid)
- Use (hope for best)
Effect + Schema approach:
- Data absent (on server) → Effect
- Data absent (unvalidated) → Schema.decode
- Both absences typed and composed
- No assumptions anywhere
This is absence composition at its finest!
Part 37 of 51 in the Effect.ts Absence Modeling series