-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.js
93 lines (84 loc) · 2.03 KB
/
utils.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
var AnyType = require('./type.js').AnyType;
function getKey(node) {
if (typeof(node) !== 'object') {
return node;
}
var obj = {};
Object.keys(node).forEach(function(key) {
if (key == 'loc' || key == 'type' || key === 'value' || key === 'name') {
obj[key] = node[key];
}
});
return obj.toSource();
}
function union(arrays) {
var allValues = [];
for (var i = 0; i < arrays.length; i++) {
allValues = allValues.concat(arrays[i]);
}
return set(allValues);
}
function intersection(arrays) {
if (arrays.length === 0) {
return [];
}
var intersectionSet = set(arrays[0]);
for (var i = 1; i < arrays.length; i++) {
intersectionSet = and(intersectionSet, set(arrays[i]));
}
return intersectionSet;
}
function intersectionByType(typeArrays) {
// Intersection of all arrays that do not include the Any type
typeArrays = typeArrays.map(set);
var constrainedTypeArrays = [];
typeArrays.forEach(function(typeArray) {
var containsAny = typeArray.findIndex(function(type) {
// type instanceof AnyType
return type.name === AnyType.name;
}) >= 0;
if (containsAny) {
return;
}
constrainedTypeArrays.push(typeArray);
});
if (constrainedTypeArrays.length === 0) {
return union(typeArrays);
}
return intersection(constrainedTypeArrays);
}
function set(array) {
var present = {};
var arrSet = [];
for (var i = 0; i < array.length; i++) {
var value = array[i];
if (present[getKey(value)]) {
continue;
}
present[getKey(value)] = true;
arrSet.push(value);
}
return arrSet;
}
function and(setA, setB) {
var present = {};
var andSet = [];
for (var i = 0; i < setA.length; i++) {
present[getKey(setA[i])] = true;
}
for (var i = 0; i < setB.length; i++) {
if (!present[getKey(setB[i])]) {
continue;
}
andSet.push(setB[i]);
}
return andSet;
}
/** Export all utility functions */
module.exports = {
union: union,
intersection: intersection,
intersectionByType: intersectionByType,
set: set,
and: and
};