/** * @since 0.9.4 */ import { HKT, Kind, Kind2, URIS, URIS2 } from 'fp-ts/HKT' import * as D from './Decoder' import * as Eq from './Eq' import * as G from './Guard' import { memoize, Schemable, Schemable1, Schemable2C, WithRefine, WithRefine1, WithRefine2C, WithUnion, WithUnion1, WithUnion2C, } from './Schemable' // ------------------------------------------------------------------------------------- // Model // ------------------------------------------------------------------------------------- /** * @category Model * @since 0.9.4 */ export interface Schema { (S: Schemable): HKT } /** * @category Model * @since 0.9.5 */ export interface WithRefineSchema { (S: Schemable & WithRefine): HKT } /** * @category Model * @since 0.9.5 */ export interface WithUnionSchema { (S: Schemable & WithUnion): HKT } /** * @category Model * @since 0.9.5 */ export interface WithUnionRefineSchema { (S: Schemable & WithUnion & WithRefine): HKT } // ------------------------------------------------------------------------------------- // constructors // ------------------------------------------------------------------------------------- /** * @category Constructor * @since 0.9.4 */ export function make(schema: Schema): Schema { return memoize(schema) } /** * @category Constructor * @since 0.9.5 */ export function withRefine(schema: WithRefineSchema): WithRefineSchema { return memoize(schema) } /** * @category Constructor * @since 0.9.5 */ export function withUnion(schema: WithUnionSchema): WithUnionSchema { return memoize(schema) } /** * @category Constructor * @since 0.9.5 */ export function create(schema: WithUnionRefineSchema): WithUnionRefineSchema { return memoize(schema) } // ------------------------------------------------------------------------------------- // utils // ------------------------------------------------------------------------------------- /** * @since 0.9.4 * @category Type-level */ export type TypeOf = S extends Schema ? A : S extends WithRefineSchema ? A : S extends WithUnionSchema ? A : S extends WithUnionRefineSchema ? A : never /** * @since 0.9.5 * @category Combinator */ export interface Interpret { (S: Schemable2C & WithRefine2C & WithUnion2C): ( schema: WithUnionRefineSchema | WithUnionSchema | WithRefineSchema | Schema, ) => Kind2 (S: Schemable2C & WithRefine2C): ( schema: WithRefineSchema | Schema, ) => Kind2 (S: Schemable2C & WithUnion2C): ( schema: WithUnionSchema | Schema, ) => Kind2 (S: Schemable2C): (schema: Schema) => Kind2 (S: Schemable1 & WithRefine1 & WithUnion1): ( schema: WithUnionRefineSchema | WithRefineSchema | WithUnionSchema | Schema, ) => Kind (S: Schemable1 & WithRefine1): ( schema: WithRefineSchema | Schema, ) => Kind (S: Schemable1 & WithUnion1): ( schema: WithUnionSchema | Schema, ) => Kind (S: Schemable1): (schema: Schema) => Kind } /** * @since 0.9.4 * @category Combinator */ export const interpret = ((schemable: Schemable) => (schema: Schema): HKT => schema(schemable)) as Interpret /** * @since 0.9.5 * @category Combinator */ export const toDecoder = interpret({ ...D.Schemable, ...D.WithUnion, ...D.WithRefine }) /** * @since 0.9.5 * @category Combinator */ export const toEq = interpret(Eq.Schemable) /** * @since 0.9.5 * @category Combinator */ export const toGuard = interpret({ ...G.Schemable, ...G.WithUnion, ...G.WithRefine })