-
Notifications
You must be signed in to change notification settings - Fork 14
/
pun.js
110 lines (109 loc) · 3.11 KB
/
pun.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
(function() {
}).call(this);
(function() {
var bindIdent, matchInnerPattern, matchPattern, out, rawBindIdent, seeIfBinding, subIdent;
bindIdent = {};
rawBindIdent = {};
subIdent = {};
seeIfBinding = function(bindings, args, value, pattern) {
if ((pattern.__bindIdent != null) && pattern.__bindIdent === bindIdent) {
bindings[pattern.binding] = value;
return true;
}
return false;
};
matchInnerPattern = function(bindings, args, value, pattern) {
if (pattern.innerPattern) {
return matchPattern(bindings, args, value, pattern.innerPattern);
} else {
return true;
}
};
matchPattern = function(bindings, args, value, pattern) {
var i, key, valuePattern, vtype, _ref;
if (pattern === out.pun._) {
return true;
}
if (pattern.__rawBindIdent === rawBindIdent) {
args.push(value);
return true;
}
if (seeIfBinding(bindings, args, value, pattern)) {
return matchInnerPattern(bindings, args, value, pattern);
}
switch (typeof pattern) {
case 'number':
case 'string':
case 'boolean':
case null:
case void 0:
return pattern === value;
case 'function':
vtype = typeof value;
switch (pattern) {
case Number:
return vtype === 'number' || value instanceof Number;
case String:
return vtype === 'string' || value instanceof String;
case Boolean:
return vtype === 'boolean' || value instanceof Boolean;
default:
return value instanceof pattern;
}
break;
case 'object':
if (Array.isArray(pattern)) {
if (value.length !== pattern.length) {
return false;
}
for (i = 0, _ref = value.length; 0 <= _ref ? i < _ref : i > _ref; 0 <= _ref ? i++ : i--) {
if (!matchPattern(bindings, args, value[i], pattern[i])) {
return false;
}
}
} else {
for (key in pattern) {
valuePattern = pattern[key];
if (!matchPattern(bindings, args, value[key], valuePattern)) {
return false;
}
}
}
}
return true;
};
out = this.windows || exports;
out.pun = {
_: {},
$: function(binding, innerPattern) {
return {
__bindIdent: bindIdent,
binding: binding,
innerPattern: innerPattern
};
},
s: function(subPattern) {
return {
__subIdent: subIdent,
subPattern: subPattern
};
},
match: function() {
var args;
args = arguments;
return function(value) {
var bindings, i, matchArgs, matchFunc, pattern, _ref;
for (i = 0, _ref = args.length; 0 <= _ref ? i < _ref : i > _ref; 0 <= _ref ? i++ : i--) {
pattern = args[i++];
matchFunc = args[i];
bindings = {};
matchArgs = [];
if (matchPattern(bindings, matchArgs, value, pattern)) {
return matchFunc.apply(bindings, matchArgs);
}
}
};
}
};
out.pun.$.__rawBindIdent = rawBindIdent;
}).call(this);