import type * as P from "@principia/prelude"; import { pureF } from "@principia/prelude"; import type * as HKT from "@principia/prelude/HKT"; import type { Literal } from "../_utils"; import type { Refinement } from "../Function"; import * as G from "../Guard"; import type { KleisliDecoder } from "./model"; export const fromRefinement = (M: P.MonadFail>) => ( refinement: Refinement, onError: (i: I) => E ): KleisliDecoder => ({ decode: (i) => (refinement(i) ? pureF(M)(i) : M.fail(onError(i))) }); export const literal = (M: P.MonadFail>) => ( onError: (i: I, values: readonly [Literal, ...Literal[]]) => E ) => (...values: A): KleisliDecoder => ({ decode: (i) => (G.literal(...values).is(i) ? pureF(M)(i as A[number]) : M.fail(onError(i, values))) });