UNPKG

4.58 kBJavaScriptView Raw
1/**
2 * **This module is experimental**
3 *
4 * Experimental features are published in order to get early feedback from the community, see these tracking
5 * [issues](https://github.com/gcanti/io-ts/issues?q=label%3Av2.2+) for further discussions and enhancements.
6 *
7 * A feature tagged as _Experimental_ is in a high state of flux, you're at risk of it changing without notice.
8 *
9 * @since 2.2.2
10 */
11import * as A from 'fp-ts/es6/Array';
12import * as E from 'fp-ts/es6/Eq';
13import { identity } from 'fp-ts/es6/function';
14import * as R from 'fp-ts/es6/Record';
15import { memoize } from './Schemable';
16// -------------------------------------------------------------------------------------
17// primitives
18// -------------------------------------------------------------------------------------
19/**
20 * @category primitives
21 * @since 2.2.2
22 */
23export var string = E.eqString;
24/**
25 * @category primitives
26 * @since 2.2.2
27 */
28export var number = E.eqNumber;
29/**
30 * @category primitives
31 * @since 2.2.2
32 */
33export var boolean = E.eqBoolean;
34/**
35 * @category primitives
36 * @since 2.2.2
37 */
38export var UnknownArray = E.fromEquals(function (x, y) { return x.length === y.length; });
39/**
40 * @category primitives
41 * @since 2.2.2
42 */
43export var UnknownRecord = E.fromEquals(function (x, y) {
44 for (var k in x) {
45 if (!(k in y)) {
46 return false;
47 }
48 }
49 for (var k in y) {
50 if (!(k in x)) {
51 return false;
52 }
53 }
54 return true;
55});
56// -------------------------------------------------------------------------------------
57// combinators
58// -------------------------------------------------------------------------------------
59/**
60 * @category combinators
61 * @since 2.2.2
62 */
63export function nullable(or) {
64 return {
65 equals: function (x, y) { return (x === null || y === null ? x === y : or.equals(x, y)); }
66 };
67}
68/**
69 * @category combinators
70 * @since 2.2.15
71 */
72export var struct = E.getStructEq;
73/**
74 * Use `struct` instead.
75 *
76 * @category combinators
77 * @since 2.2.2
78 * @deprecated
79 */
80export var type = struct;
81/**
82 * @category combinators
83 * @since 2.2.2
84 */
85export function partial(properties) {
86 return {
87 equals: function (x, y) {
88 for (var k in properties) {
89 var xk = x[k];
90 var yk = y[k];
91 if (!(xk === undefined || yk === undefined ? xk === yk : properties[k].equals(xk, yk))) {
92 return false;
93 }
94 }
95 return true;
96 }
97 };
98}
99/**
100 * @category combinators
101 * @since 2.2.2
102 */
103export var record = R.getEq;
104/**
105 * @category combinators
106 * @since 2.2.2
107 */
108export var array = A.getEq;
109/**
110 * @category combinators
111 * @since 2.2.2
112 */
113export var tuple = E.getTupleEq;
114/**
115 * @category combinators
116 * @since 2.2.2
117 */
118export var intersect = function (right) { return function (left) { return ({
119 equals: function (x, y) { return left.equals(x, y) && right.equals(x, y); }
120}); }; };
121/**
122 * @category combinators
123 * @since 2.2.2
124 */
125export function sum(tag) {
126 return function (members) {
127 return {
128 equals: function (x, y) {
129 var vx = x[tag];
130 var vy = y[tag];
131 if (vx !== vy) {
132 return false;
133 }
134 return members[vx].equals(x, y);
135 }
136 };
137 };
138}
139/**
140 * @category combinators
141 * @since 2.2.2
142 */
143export function lazy(f) {
144 var get = memoize(f);
145 return {
146 equals: function (x, y) { return get().equals(x, y); }
147 };
148}
149/**
150 * @category combinators
151 * @since 2.2.15
152 */
153export var readonly = identity;
154// -------------------------------------------------------------------------------------
155// instances
156// -------------------------------------------------------------------------------------
157/**
158 * @category instances
159 * @since 2.2.8
160 */
161export var Schemable = {
162 URI: E.URI,
163 literal: function () { return E.eqStrict; },
164 string: string,
165 number: number,
166 boolean: boolean,
167 nullable: nullable,
168 type: type,
169 struct: struct,
170 partial: partial,
171 record: record,
172 array: array,
173 tuple: tuple,
174 intersect: intersect,
175 sum: sum,
176 lazy: function (_, f) { return lazy(f); },
177 readonly: readonly
178};
179/**
180 * @category instances
181 * @since 2.2.8
182 */
183export var WithUnknownContainers = {
184 UnknownArray: UnknownArray,
185 UnknownRecord: UnknownRecord
186};
187/**
188 * @category instances
189 * @since 2.2.8
190 */
191export var WithRefine = {
192 refine: function () { return function (from) { return from; }; }
193};