UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

271 lines 6.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WithRefine = exports.WithUnion = exports.Schemable = exports.URI = exports.id = exports.compose = exports.zero = exports.alt = exports.readonly = exports.lazy = exports.sum = exports.union = exports.intersect = exports.tuple = exports.record = exports.array = exports.partial = exports.type = exports.struct = exports.nullable = exports.refine = exports.unknownRecord = exports.unknownArray = exports.date = exports.boolean = exports.number = exports.string = exports.literal = void 0; /** * Guard is a Typeclass for expressing Refinements * * @since 0.9.5 */ const function_1 = require("fp-ts/function"); const Schemable_1 = require("./Schemable"); // ------------------------------------------------------------------------------------- // constructors // ------------------------------------------------------------------------------------- /** * @category constructors * @since 0.9.5 */ const literal = (...values) => ({ is: (u) => values.findIndex((a) => a === u) !== -1, }); exports.literal = literal; // ------------------------------------------------------------------------------------- // Decoder // ------------------------------------------------------------------------------------- /** * @category Decoder * @since 0.9.5 */ exports.string = { is: (u) => typeof u === 'string', }; /** * Note: `NaN` is excluded. * * @category Decoder * @since 0.9.5 */ exports.number = { is: (u) => typeof u === 'number' && !isNaN(u), }; /** * @category Decoder * @since 0.9.5 */ exports.boolean = { is: (u) => typeof u === 'boolean', }; /** * @category Decoder * @since 0.9.5 */ exports.date = { is: (u) => u instanceof Date, }; /** * @category Decoder * @since 0.9.5 */ exports.unknownArray = { is: Array.isArray, }; /** * @category Decoder * @since 0.9.5 */ exports.unknownRecord = { is: (u) => u !== null && typeof u === 'object' && !Array.isArray(u), }; // ------------------------------------------------------------------------------------- // Combinator // ------------------------------------------------------------------------------------- /** * @category Combinator * @since 0.9.5 */ const refine = (refinement) => (from) => ({ is: (i) => from.is(i) && refinement(i), }); exports.refine = refine; /** * @category Combinator * @since 0.9.5 */ const nullable = (or) => ({ is: (i) => i === null || or.is(i), }); exports.nullable = nullable; /** * @category Combinator * @since 2.2.15 */ const struct = (properties) => (0, function_1.pipe)(exports.unknownRecord, (0, exports.refine)((r) => { for (const k in properties) { if (!(k in r) || !properties[k].is(r[k])) { return false; } } return true; })); exports.struct = struct; /** * Use `struct` instead. * * @category Combinator * @since 0.9.5 * @deprecated */ exports.type = exports.struct; /** * @category Combinator * @since 0.9.5 */ const partial = (properties) => (0, function_1.pipe)(exports.unknownRecord, (0, exports.refine)((r) => { for (const k in properties) { const v = r[k]; if (v !== undefined && !properties[k].is(v)) { return false; } } return true; })); exports.partial = partial; /** * @category Combinator * @since 0.9.5 */ const array = (item) => (0, function_1.pipe)(exports.unknownArray, (0, exports.refine)((us) => us.every(item.is))); exports.array = array; /** * @category Combinator * @since 0.9.5 */ const record = (codomain) => (0, function_1.pipe)(exports.unknownRecord, (0, exports.refine)((r) => { for (const k in r) { if (!codomain.is(r[k])) { return false; } } return true; })); exports.record = record; /** * @category Combinator * @since 0.9.5 */ const tuple = (...components) => ({ is: (u) => Array.isArray(u) && u.length === components.length && components.every((c, i) => c.is(u[i])), }); exports.tuple = tuple; /** * @category Combinator * @since 0.9.5 */ const intersect = (right) => (left) => ({ is: (u) => left.is(u) && right.is(u), }); exports.intersect = intersect; /** * @category Combinator * @since 0.9.5 */ const union = (second) => (first) => ({ is: (u) => first.is(u) || second.is(u), }); exports.union = union; /** * @category Combinator * @since 0.9.5 */ const sum = (tag) => (members) => (0, function_1.pipe)(exports.unknownRecord, (0, exports.refine)((r) => { const v = r[tag]; if (v in members) { return members[v].is(r); } return false; })); exports.sum = sum; /** * @category Combinator * @since 0.9.5 */ const lazy = (f) => { const get = (0, Schemable_1.memoize)(f); return { is: (u) => get().is(u), }; }; exports.lazy = lazy; /** * @category Combinator * @since 2.2.15 */ exports.readonly = function_1.identity; /** * @category Combinator * @since 0.9.5 */ const alt = (that) => (me) => ({ is: (i) => me.is(i) || that().is(i), }); exports.alt = alt; /** * @category Combinator * @since 0.9.5 */ const zero = () => ({ is: (_) => false, }); exports.zero = zero; /** * @category Combinator * @since 0.9.5 */ const compose = (to) => (from) => ({ is: (i) => from.is(i) && to.is(i), }); exports.compose = compose; /** * @category Combinator * @since 0.9.5 */ const id = () => ({ is: (_) => true, }); exports.id = id; // ------------------------------------------------------------------------------------- // instances // ------------------------------------------------------------------------------------- /** * @category instances * @since 0.9.5 */ exports.URI = '@typed/fp/Guard'; /** * @category instances * @since 0.9.5 */ exports.Schemable = { URI: exports.URI, literal: exports.literal, string: exports.string, number: exports.number, boolean: exports.boolean, date: exports.date, nullable: exports.nullable, struct: exports.struct, record: exports.record, array: exports.array, tuple: exports.tuple, intersect: exports.intersect, sum: exports.sum, lazy: (_, f) => (0, exports.lazy)(f), branded: function_1.identity, unknownArray: exports.unknownArray, unknownRecord: exports.unknownRecord, }; /** * @category instances * @since 0.9.5 */ exports.WithUnion = { union: exports.union, }; /** * @category instances * @since 0.9.5 */ exports.WithRefine = { refine: exports.refine, }; //# sourceMappingURL=Guard.js.map