/** * @since 0.9.4 */ import { HKT, Kind, Kind2, URIS, URIS2 } from 'fp-ts/HKT' import { Refinement } from 'fp-ts/Refinement' import { Branded, ValueOf } from './Branded' /** * @since 0.9.4 */ export type Literal = string | number | boolean | null /** * @since 0.9.4 */ export interface Schemable { readonly URI: S readonly literal: ]>( ...values: A ) => HKT readonly string: HKT readonly number: HKT readonly boolean: HKT readonly date: HKT readonly nullable: (or: HKT) => HKT readonly struct: ( properties: { [K in keyof A]: HKT }, ) => HKT readonly record: (codomain: HKT) => HKT> readonly array: (item: HKT) => HKT> readonly tuple: >( ...components: { readonly [K in keyof A]: HKT } ) => HKT readonly intersect: (right: HKT) => (left: HKT) => HKT readonly sum: ( tag: T, ) => (members: { [K in keyof A]: HKT> }) => HKT readonly lazy: (id: string, f: () => HKT) => HKT readonly branded: >(item: HKT>) => HKT readonly unknownArray: HKT> readonly unknownRecord: HKT> } /** * @since 0.9.4 */ export interface Schemable1 { readonly URI: S readonly literal: ]>( ...values: A ) => Kind readonly string: Kind readonly number: Kind readonly boolean: Kind readonly date: Kind readonly nullable: (or: Kind) => Kind readonly struct: ( properties: { [K in keyof A]: Kind }, ) => Kind readonly record: (codomain: Kind) => Kind> readonly array: (item: Kind) => Kind> readonly tuple: >( ...components: { readonly [K in keyof A]: Kind } ) => Kind readonly intersect: (right: Kind) => (left: Kind) => Kind readonly sum: ( tag: T, ) => (members: { [K in keyof A]: Kind> }) => Kind readonly lazy: (id: string, f: () => Kind) => Kind readonly branded: >(item: Kind>) => Kind readonly unknownArray: Kind> readonly unknownRecord: Kind> } /** * @since 0.9.4 */ export interface Schemable2C { readonly URI: S readonly literal: ]>( ...values: A ) => Kind2 readonly string: Kind2 readonly number: Kind2 readonly boolean: Kind2 readonly date: Kind2 readonly nullable: (or: Kind2) => Kind2 readonly optional: (or: Kind2) => Kind2 readonly struct: ( properties: { [K in keyof A]: Kind2 }, ) => Kind2 readonly record: (codomain: Kind2) => Kind2> readonly array: (item: Kind2) => Kind2> readonly tuple: ( ...components: { readonly [K in keyof A]: Kind2 } ) => Kind2 readonly intersect: (right: Kind2) => (left: Kind2) => Kind2 readonly sum: ( tag: T, ) => (members: { [K in keyof A]: Kind2> }) => Kind2 readonly lazy: (id: string, f: () => Kind2) => Kind2 readonly branded: >(item: Kind2>) => Kind2 readonly unknownArray: Kind2> readonly unknownRecord: Kind2> } /** * @since 0.9.4 */ export interface WithUnion { readonly union: (second: HKT) => (first: HKT) => HKT } /** * @since 0.9.4 */ export interface WithUnion1 { readonly union: (second: Kind) => (first: Kind) => Kind } /** * @since 0.9.4 */ export interface WithUnion2C { readonly union: (second: Kind2) => (first: Kind2) => Kind2 } /** * @since 0.9.4 */ export interface WithRefine { readonly refine: ( refinement: Refinement, id: string, ) => (from: HKT) => HKT } /** * @since 0.9.4 */ export interface WithRefine1 { readonly refine: ( refinement: Refinement, id: string, ) => (from: Kind) => Kind } /** * @since 0.9.4 */ export interface WithRefine2C { readonly refine: ( refinement: Refinement, id: string, ) => (from: Kind2) => Kind2 } /** * @since 0.9.4 */ export function memoize(f: (a: A) => B): (a: A) => B { const cache = new Map() return (a) => { if (!cache.has(a)) { const b = f(a) cache.set(a, b) return b } return cache.get(a) } }