import type { Literal } from "../_utils"; import type { Refinement } from "../Function"; import type { Guard } from "../Guard"; import * as K from "../KleisliDecoder"; import type { ErrorInfo } from "./decode-error"; import { error } from "./decode-error"; import type { Decoder } from "./model"; import { M } from "./monad"; export const fromRefinement = ( refinement: Refinement, expected: string, info?: ErrorInfo ): Decoder => ({ decode: K.fromRefinement(M)(refinement, (u) => error(u, expected, info)).decode, _meta: { name: expected } }); export const fromGuard = (guard: Guard, expected: string, info?: ErrorInfo): Decoder => fromRefinement(guard.is, expected, info); export const literal: ]>( ...values: A ) => (info?: ErrorInfo) => Decoder = (...values) => (info) => ({ decode: K.literal(M)((u, values) => error(u, values.map((value) => JSON.stringify(value)).join(" | "), info))( ...values ).decode, _meta: { name: values.map((value) => JSON.stringify(value)).join(" | ") } });