import { Schema as S } from "@effect/schema" import * as TF from "type-fest" const MyObjectStruct = S.Struct({ id: S.BigIntFromSelf, name: S.String, }) class MyObjectClass extends S.Class("MyObjectClass")({ id: S.BigIntFromSelf, name: S.String, }) {} const MyJsonifiedObject = S.Struct({ ...MyObjectStruct.fields, id: S.BigInt, }) export function Jsonifiable< A, I, R, JsonifiableA extends I, JsonifiableI extends TF.Jsonifiable, JsonifiableR, >( schema: S.Schema, jsonifiable: S.Schema, ) { return jsonifiable.pipe(S.compose(schema)) } export function JsonifiableStruct< A, I, R, JsonifiableA extends I, JsonifiableI extends TF.Jsonifiable, JsonifiableR, JsonifiableFields extends S.Struct.Fields, >( schema: S.Schema, jsonifiable: S.Struct & S.Schema, ) { return jsonifiable.pipe(S.compose(schema)) } const MyJsonifiableObject = Jsonifiable(MyObjectStruct, MyJsonifiedObject) const MyJsonifiableObject2 = JsonifiableStruct(MyObjectStruct, MyJsonifiedObject)