UNPKG

4.81 kBJavaScriptView Raw
1/**
2 * @since 2.2.0
3 */
4import { memoize } from './Schemable';
5// -------------------------------------------------------------------------------------
6// constructors
7// -------------------------------------------------------------------------------------
8/**
9 * @since 2.2.0
10 */
11export function literal() {
12 var values = [];
13 for (var _i = 0; _i < arguments.length; _i++) {
14 values[_i] = arguments[_i];
15 }
16 return {
17 is: function (u) { return values.findIndex(function (a) { return a === u; }) !== -1; }
18 };
19}
20// -------------------------------------------------------------------------------------
21// primitives
22// -------------------------------------------------------------------------------------
23/**
24 * @since 2.2.0
25 */
26export var never = {
27 is: function (_u) { return false; }
28};
29/**
30 * @since 2.2.0
31 */
32export var string = {
33 is: function (u) { return typeof u === 'string'; }
34};
35/**
36 * @since 2.2.0
37 */
38export var number = {
39 is: function (u) { return typeof u === 'number'; }
40};
41/**
42 * @since 2.2.0
43 */
44export var boolean = {
45 is: function (u) { return typeof u === 'boolean'; }
46};
47/**
48 * @since 2.2.0
49 */
50export var UnknownArray = {
51 is: Array.isArray
52};
53/**
54 * @since 2.2.0
55 */
56export var UnknownRecord = {
57 is: function (u) { return Object.prototype.toString.call(u) === '[object Object]'; }
58};
59// -------------------------------------------------------------------------------------
60// combinators
61// -------------------------------------------------------------------------------------
62/**
63 * @since 2.2.0
64 */
65export function refinement(from, refinement) {
66 return {
67 is: function (u) { return from.is(u) && refinement(u); }
68 };
69}
70/**
71 * @since 2.2.0
72 */
73export function nullable(or) {
74 return {
75 is: function (u) { return u === null || or.is(u); }
76 };
77}
78/**
79 * @since 2.2.0
80 */
81export function type(properties) {
82 return refinement(UnknownRecord, function (r) {
83 for (var k in properties) {
84 if (!(k in r) || !properties[k].is(r[k])) {
85 return false;
86 }
87 }
88 return true;
89 });
90}
91/**
92 * @since 2.2.0
93 */
94export function partial(properties) {
95 return refinement(UnknownRecord, function (r) {
96 for (var k in properties) {
97 var v = r[k];
98 if (v !== undefined && !properties[k].is(v)) {
99 return false;
100 }
101 }
102 return true;
103 });
104}
105/**
106 * @since 2.2.0
107 */
108export function record(codomain) {
109 return refinement(UnknownRecord, function (r) {
110 for (var k in r) {
111 if (!codomain.is(r[k])) {
112 return false;
113 }
114 }
115 return true;
116 });
117}
118/**
119 * @since 2.2.0
120 */
121export function array(items) {
122 return refinement(UnknownArray, function (us) { return us.every(items.is); });
123}
124/**
125 * @since 2.2.0
126 */
127export function tuple() {
128 var components = [];
129 for (var _i = 0; _i < arguments.length; _i++) {
130 components[_i] = arguments[_i];
131 }
132 return {
133 is: function (u) { return Array.isArray(u) && u.length === components.length && components.every(function (c, i) { return c.is(u[i]); }); }
134 };
135}
136/**
137 * @since 2.2.0
138 */
139export function intersection(left, right) {
140 return {
141 is: function (u) { return left.is(u) && right.is(u); }
142 };
143}
144/**
145 * @since 2.2.0
146 */
147export function union() {
148 var members = [];
149 for (var _i = 0; _i < arguments.length; _i++) {
150 members[_i] = arguments[_i];
151 }
152 return {
153 is: function (u) { return members.some(function (m) { return m.is(u); }); }
154 };
155}
156/**
157 * @since 2.2.0
158 */
159export function sum(tag) {
160 return function (members) {
161 return refinement(UnknownRecord, function (r) {
162 var v = r[tag];
163 if (string.is(v) && v in members) {
164 return members[v].is(r);
165 }
166 return false;
167 });
168 };
169}
170/**
171 * @since 2.2.0
172 */
173export function lazy(f) {
174 var get = memoize(f);
175 return {
176 is: function (u) { return get().is(u); }
177 };
178}
179// -------------------------------------------------------------------------------------
180// instances
181// -------------------------------------------------------------------------------------
182/**
183 * @since 2.2.0
184 */
185export var URI = 'io-ts/Guard';
186/**
187 * @since 2.2.3
188 */
189export var schemableGuard = {
190 URI: URI,
191 literal: literal,
192 string: string,
193 number: number,
194 boolean: boolean,
195 nullable: nullable,
196 type: type,
197 partial: partial,
198 record: record,
199 array: array,
200 tuple: tuple,
201 intersection: intersection,
202 sum: sum,
203 lazy: function (_, f) { return lazy(f); },
204 UnknownArray: UnknownArray,
205 UnknownRecord: UnknownRecord,
206 union: union,
207 refinement: refinement
208};