import { Option } from "effect" import { identity } from "lodash-es" import { z } from "zod" export const option = { option: (schema: S) => z.union([option.some(schema), option.none(schema)]), some: (schema: S) => z .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") .pipe(z.object({ value: schema }).passthrough()) .transform>>(identity), none: (_schema?: S) => z.custom : unknown >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), } as const