UNPKG

3.35 kBJavaScriptView Raw
1/**
2 * @since 2.2.2
3 */
4import * as A from 'fp-ts/es6/Array';
5import * as E from 'fp-ts/es6/Eq';
6import * as R from 'fp-ts/es6/Record';
7import { memoize } from './Schemable';
8// -------------------------------------------------------------------------------------
9// primitives
10// -------------------------------------------------------------------------------------
11/**
12 * @since 2.2.2
13 */
14export var string = E.eqString;
15/**
16 * @since 2.2.2
17 */
18export var number = E.eqNumber;
19/**
20 * @since 2.2.2
21 */
22export var boolean = E.eqBoolean;
23/**
24 * @since 2.2.2
25 */
26export var UnknownArray = E.fromEquals(function (x, y) { return x.length === y.length; });
27/**
28 * @since 2.2.2
29 */
30export var UnknownRecord = E.fromEquals(function (x, y) {
31 for (var k in x) {
32 if (!(k in y)) {
33 return false;
34 }
35 }
36 for (var k in y) {
37 if (!(k in x)) {
38 return false;
39 }
40 }
41 return true;
42});
43// -------------------------------------------------------------------------------------
44// combinators
45// -------------------------------------------------------------------------------------
46/**
47 * @since 2.2.2
48 */
49export function nullable(or) {
50 return {
51 equals: function (x, y) { return (x === null || y === null ? x === y : or.equals(x, y)); }
52 };
53}
54/**
55 * @since 2.2.2
56 */
57export var type = E.getStructEq;
58/**
59 * @since 2.2.2
60 */
61export function partial(properties) {
62 return {
63 equals: function (x, y) {
64 for (var k in properties) {
65 var xk = x[k];
66 var yk = y[k];
67 if (!(xk === undefined || yk === undefined ? xk === yk : properties[k].equals(xk, yk))) {
68 return false;
69 }
70 }
71 return true;
72 }
73 };
74}
75/**
76 * @since 2.2.2
77 */
78export var record = R.getEq;
79/**
80 * @since 2.2.2
81 */
82export var array = A.getEq;
83/**
84 * @since 2.2.2
85 */
86export var tuple = E.getTupleEq;
87/**
88 * @since 2.2.2
89 */
90export function intersection(left, right) {
91 return {
92 equals: function (x, y) { return left.equals(x, y) && right.equals(x, y); }
93 };
94}
95/**
96 * @since 2.2.2
97 */
98export function sum(tag) {
99 return function (members) {
100 return {
101 equals: function (x, y) {
102 var vx = x[tag];
103 var vy = y[tag];
104 if (vx !== vy) {
105 return false;
106 }
107 return members[vx].equals(x, y);
108 }
109 };
110 };
111}
112/**
113 * @since 2.2.2
114 */
115export function lazy(f) {
116 var get = memoize(f);
117 return {
118 equals: function (x, y) { return get().equals(x, y); }
119 };
120}
121// -------------------------------------------------------------------------------------
122// instances
123// -------------------------------------------------------------------------------------
124/**
125 * @since 2.2.3
126 */
127export var schemableEq = {
128 URI: E.URI,
129 literal: function () { return E.eqStrict; },
130 string: string,
131 number: number,
132 boolean: boolean,
133 nullable: nullable,
134 type: type,
135 partial: partial,
136 record: record,
137 array: array,
138 tuple: tuple,
139 intersection: intersection,
140 sum: sum,
141 lazy: function (_, f) { return lazy(f); },
142 UnknownArray: UnknownArray,
143 UnknownRecord: UnknownRecord,
144 refinement: function (from) { return from; }
145};