forked from montagejs/frb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
compile-observer.js
101 lines (92 loc) · 3.94 KB
/
compile-observer.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
var Observers = require("./observers");
var Operators = require("./operators");
module.exports = compile;
function compile(syntax) {
return semantics.compile(syntax);
}
var semantics = compile.semantics = {
compilers: {
property: Observers.makePropertyObserver,
get: Observers.makeGetObserver,
path: Observers.makePathObserver,
"with": Observers.makeWithObserver,
"if": Observers.makeConditionalObserver,
parent: Observers.makeParentObserver,
not: Observers.makeNotObserver,
and: Observers.makeAndObserver,
or: Observers.makeOrObserver,
"default": Observers.makeDefaultObserver,
defined: Observers.makeDefinedObserver,
rangeContent: Observers.makeAsArrayObserver,
mapContent: Function.identity,
keys: Observers.makeKeysObserver,
values: Observers.makeValuesObserver,
items: Observers.makeEntriesObserver, // XXX deprecated
entries: Observers.makeEntriesObserver,
toMap: Observers.makeToMapObserver,
mapBlock: Observers.makeMapBlockObserver,
filterBlock: Observers.makeFilterBlockObserver,
everyBlock: Observers.makeEveryBlockObserver,
someBlock: Observers.makeSomeBlockObserver,
sortedBlock: Observers.makeSortedBlockObserver,
sortedSetBlock: Observers.makeSortedSetBlockObserver,
groupBlock: Observers.makeGroupBlockObserver,
groupMapBlock: Observers.makeGroupMapBlockObserver,
minBlock: Observers.makeMinBlockObserver,
maxBlock: Observers.makeMaxBlockObserver,
enumerate: Observers.makeEnumerationObserver,
reversed: Observers.makeReversedObserver,
flatten: Observers.makeFlattenObserver,
concat: Observers.makeConcatObserver,
view: Observers.makeViewObserver,
sum: Observers.makeSumObserver,
average: Observers.makeAverageObserver,
last: Observers.makeLastObserver,
only: Observers.makeOnlyObserver,
has: Observers.makeHasObserver,
// TODO zip
tuple: Observers.makeArrayObserver,
range: Observers.makeRangeObserver,
startsWith: Observers.makeStartsWithObserver,
endsWith: Observers.makeEndsWithObserver,
contains: Observers.makeContainsObserver,
join: Observers.makeJoinObserver,
toArray: Observers.makeToArrayObserver,
asArray: Observers.makeToArrayObserver // XXX deprecated
},
compile: function (syntax) {
var compilers = this.compilers;
if (syntax.type === "literal") {
return Observers.makeLiteralObserver(syntax.value);
} else if (syntax.type === "value") {
return Observers.observeValue;
} else if (syntax.type === "parameters") {
return Observers.observeParameters;
} else if (syntax.type === "element") {
return Observers.makeElementObserver(syntax.id);
} else if (syntax.type === "component") {
return Observers.makeComponentObserver(syntax.label, syntax);
} else if (syntax.type === "record") {
var observers = {};
var args = syntax.args;
for (var name in args) {
observers[name] = this.compile(args[name]);
}
return Observers.makeObjectObserver(observers);
} else {
if (!compilers.hasOwnProperty(syntax.type)) {
compilers[syntax.type] = Observers.makeMethodObserverMaker(syntax.type);
}
var argObservers = syntax.args.map(this.compile, this);
return compilers[syntax.type].apply(null, argObservers);
}
}
};
var compilers = semantics.compilers;
Object.keys(Operators).forEach(function (name) {
if (!compilers[name]) {
compilers[name] = Observers.makeOperatorObserverMaker(Operators[name]);
}
});
// a special Hell for non-enumerable inheritance
compilers.toString = Observers.makeOperatorObserverMaker(Operators.toString);