forked from gcanti/tcomb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrefinement.js
66 lines (51 loc) · 2.1 KB
/
refinement.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var assert = require('./assert');
var isTypeName = require('./isTypeName');
var isFunction = require('./isFunction');
var forbidNewOperator = require('./forbidNewOperator');
var isIdentity = require('./isIdentity');
var create = require('./create');
var is = require('./is');
var getTypeName = require('./getTypeName');
var getFunctionName = require('./getFunctionName');
function getDefaultName(type, predicate) {
return '{' + getTypeName(type) + ' | ' + getFunctionName(predicate) + '}';
}
function refinement(type, predicate, name) {
if (process.env.NODE_ENV !== 'production') {
assert(isFunction(type), function () { return 'Invalid argument type ' + assert.stringify(type) + ' supplied to refinement(type, predicate, [name]) combinator (expected a type)'; });
assert(isFunction(predicate), function () { return 'Invalid argument predicate supplied to refinement(type, predicate, [name]) combinator (expected a function)'; });
assert(isTypeName(name), function () { return 'Invalid argument name ' + assert.stringify(name) + ' supplied to refinement(type, predicate, [name]) combinator (expected a string)'; });
}
var displayName = name || getDefaultName(type, predicate);
var identity = isIdentity(type);
function Refinement(value, path) {
if (process.env.NODE_ENV !== 'production') {
if (identity) {
forbidNewOperator(this, Refinement);
}
path = path || [displayName];
}
var x = create(type, value, path);
if (process.env.NODE_ENV !== 'production') {
assert(predicate(x), function () { return 'Invalid value ' + assert.stringify(value) + ' supplied to ' + path.join('/'); });
}
return x;
}
Refinement.meta = {
kind: 'subtype',
type: type,
predicate: predicate,
name: name,
identity: identity
};
Refinement.displayName = displayName;
Refinement.is = function (x) {
return is(x, type) && predicate(x);
};
Refinement.update = function (instance, patch) {
return Refinement(assert.update(instance, patch));
};
return Refinement;
}
refinement.getDefaultName = getDefaultName;
module.exports = refinement;