Effect.ts: Absence as First-Class

ValidationLesson 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:

  1. Fetch (assume works)
  2. Parse (assume valid)
  3. Use (hope for best)

Effect + Schema approach:

  1. Data absent (on server) → Effect
  2. Data absent (unvalidated) → Schema.decode
  3. Both absences typed and composed
  4. No assumptions anywhere

This is absence composition at its finest!


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