Implementing a Fallback Schema with Effect Typescript

Is there a better way than this to implement a fallback schema?


import { Schema } from "effect";

const makeFallback = <
  PrimaryEncoded,
  PrimaryDecoded,
  SecondaryEncoded,
  SecondaryDecoded,
>(
  primary: Schema.Schema<PrimaryDecoded, PrimaryEncoded>,
  secondary: Schema.Schema<SecondaryDecoded, SecondaryEncoded>,
  compatMap: (val: SecondaryDecoded) => PrimaryEncoded,
  isSecondary: (
    val: PrimaryDecoded | SecondaryDecoded,
  ) => val is SecondaryDecoded,
) =>
  Schema.transform(Schema.Union(primary, secondary), primary, {
    strict: true,
    decode: (decoded, encoded) =>
      isSecondary(decoded) ? compatMap(decoded) : (encoded as PrimaryEncoded),
    encode: (_, decoded) => decoded,
  }).pipe(Schema.asSchema);

const result = makeFallback(
  Schema.NumberFromString,
  Schema.Boolean,
  (bool) => (bool ? "1" : "0"),
  (numOrBool) => numOrBool === true || numOrBool === false,
);
Was this page helpful?