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,
);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,
);