amis-formula 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/doc.js +1 -1
- package/esm/evalutor.d.ts +4 -0
- package/esm/evalutor.js +2 -2
- package/esm/evalutorForAsync.d.ts +281 -0
- package/esm/evalutorForAsync.js +1069 -0
- package/esm/filter.js +1 -1
- package/esm/function.js +1 -1
- package/esm/index.d.ts +3 -1
- package/esm/index.js +18 -2
- package/esm/lexer.js +1 -1
- package/esm/parser.js +1 -1
- package/lib/doc.js +1 -1
- package/lib/evalutor.d.ts +4 -0
- package/lib/evalutor.js +5 -1
- package/lib/evalutorForAsync.d.ts +281 -0
- package/lib/evalutorForAsync.js +1074 -0
- package/lib/filter.js +1 -1
- package/lib/function.js +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +18 -1
- package/lib/lexer.js +1 -1
- package/lib/parser.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,1069 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* amis-formula v2.9.0
|
|
3
|
+
* Copyright 2021-2023 fex
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { __extends, __awaiter, __generator } from 'tslib';
|
|
7
|
+
import { stripNumber, createObject, Evaluator } from './evalutor.js';
|
|
8
|
+
|
|
9
|
+
function runSequence(arr, fn) {
|
|
10
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
11
|
+
var result;
|
|
12
|
+
var _this = this;
|
|
13
|
+
return __generator(this, function (_a) {
|
|
14
|
+
switch (_a.label) {
|
|
15
|
+
case 0:
|
|
16
|
+
result = [];
|
|
17
|
+
return [4 /*yield*/, arr.reduce(function (promise, item, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
18
|
+
var _a, _b;
|
|
19
|
+
return __generator(this, function (_c) {
|
|
20
|
+
switch (_c.label) {
|
|
21
|
+
case 0: return [4 /*yield*/, promise];
|
|
22
|
+
case 1:
|
|
23
|
+
_c.sent();
|
|
24
|
+
_b = (_a = result).push;
|
|
25
|
+
return [4 /*yield*/, fn(item, index)];
|
|
26
|
+
case 2:
|
|
27
|
+
_b.apply(_a, [_c.sent()]);
|
|
28
|
+
return [2 /*return*/];
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}); }, Promise.resolve())];
|
|
32
|
+
case 1:
|
|
33
|
+
_a.sent();
|
|
34
|
+
return [2 /*return*/, result];
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
var AsyncEvaluator = /** @class */ (function (_super) {
|
|
40
|
+
__extends(AsyncEvaluator, _super);
|
|
41
|
+
function AsyncEvaluator(data, options) {
|
|
42
|
+
return _super.call(this, data, options) || this;
|
|
43
|
+
}
|
|
44
|
+
AsyncEvaluator.prototype.document = function (ast) {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
46
|
+
var isString, content;
|
|
47
|
+
var _this = this;
|
|
48
|
+
return __generator(this, function (_a) {
|
|
49
|
+
switch (_a.label) {
|
|
50
|
+
case 0:
|
|
51
|
+
if (!ast.body.length) {
|
|
52
|
+
return [2 /*return*/, undefined];
|
|
53
|
+
}
|
|
54
|
+
isString = ast.body.length > 1;
|
|
55
|
+
return [4 /*yield*/, runSequence(ast.body, function (item) { return __awaiter(_this, void 0, void 0, function () {
|
|
56
|
+
var result;
|
|
57
|
+
return __generator(this, function (_a) {
|
|
58
|
+
result = this.evalute(item);
|
|
59
|
+
if (isString && result == null) {
|
|
60
|
+
// 不要出现 undefined, null 之类的文案
|
|
61
|
+
return [2 /*return*/, ''];
|
|
62
|
+
}
|
|
63
|
+
return [2 /*return*/, result];
|
|
64
|
+
});
|
|
65
|
+
}); })];
|
|
66
|
+
case 1:
|
|
67
|
+
content = _a.sent();
|
|
68
|
+
return [2 /*return*/, content.length === 1 ? content[0] : content.join('')];
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
AsyncEvaluator.prototype.filter = function (ast) {
|
|
74
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
75
|
+
var input, filters, context, result;
|
|
76
|
+
var _this = this;
|
|
77
|
+
return __generator(this, function (_a) {
|
|
78
|
+
switch (_a.label) {
|
|
79
|
+
case 0: return [4 /*yield*/, this.evalute(ast.input)];
|
|
80
|
+
case 1:
|
|
81
|
+
input = _a.sent();
|
|
82
|
+
filters = ast.filters.concat();
|
|
83
|
+
context = {
|
|
84
|
+
filter: undefined,
|
|
85
|
+
data: this.context,
|
|
86
|
+
restFilters: filters
|
|
87
|
+
};
|
|
88
|
+
return [4 /*yield*/, filters.reduce(function (ps, filter, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
89
|
+
var input, fn, argsRes;
|
|
90
|
+
var _this = this;
|
|
91
|
+
return __generator(this, function (_a) {
|
|
92
|
+
switch (_a.label) {
|
|
93
|
+
case 0: return [4 /*yield*/, ps];
|
|
94
|
+
case 1:
|
|
95
|
+
input = _a.sent();
|
|
96
|
+
fn = this.filters[filter.name];
|
|
97
|
+
if (!fn) {
|
|
98
|
+
throw new Error("filter `".concat(filter.name, "` not exists."));
|
|
99
|
+
}
|
|
100
|
+
context.filter = filter;
|
|
101
|
+
return [4 /*yield*/, filter.args.reduce(function (promise, item) { return __awaiter(_this, void 0, void 0, function () {
|
|
102
|
+
var _this = this;
|
|
103
|
+
return __generator(this, function (_a) {
|
|
104
|
+
switch (_a.label) {
|
|
105
|
+
case 0: return [4 /*yield*/, promise];
|
|
106
|
+
case 1:
|
|
107
|
+
_a.sent();
|
|
108
|
+
if ((item === null || item === void 0 ? void 0 : item.type) === 'mixed') {
|
|
109
|
+
return [2 /*return*/, runSequence(item.body, function (item) {
|
|
110
|
+
return typeof item === 'string' ? item : _this.evalute(item);
|
|
111
|
+
})];
|
|
112
|
+
}
|
|
113
|
+
else if (item.type) {
|
|
114
|
+
return [2 /*return*/, this.evalute(item)];
|
|
115
|
+
}
|
|
116
|
+
return [2 /*return*/, item];
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}); }, Promise.resolve([]))];
|
|
120
|
+
case 2:
|
|
121
|
+
argsRes = _a.sent();
|
|
122
|
+
return [2 /*return*/, fn.apply(context, [input].concat(argsRes))];
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}); }, Promise.resolve(input))];
|
|
126
|
+
case 2:
|
|
127
|
+
result = _a.sent();
|
|
128
|
+
return [2 /*return*/, result];
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
AsyncEvaluator.prototype.template = function (ast) {
|
|
134
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
135
|
+
var args;
|
|
136
|
+
var _this = this;
|
|
137
|
+
return __generator(this, function (_a) {
|
|
138
|
+
switch (_a.label) {
|
|
139
|
+
case 0: return [4 /*yield*/, runSequence(ast.body, function (arg) { return _this.evalute(arg); })];
|
|
140
|
+
case 1:
|
|
141
|
+
args = _a.sent();
|
|
142
|
+
return [2 /*return*/, args.join('')];
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
// 下标获取
|
|
148
|
+
AsyncEvaluator.prototype.getter = function (ast) {
|
|
149
|
+
var _a;
|
|
150
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
151
|
+
var host, key;
|
|
152
|
+
return __generator(this, function (_b) {
|
|
153
|
+
switch (_b.label) {
|
|
154
|
+
case 0: return [4 /*yield*/, this.evalute(ast.host)];
|
|
155
|
+
case 1:
|
|
156
|
+
host = _b.sent();
|
|
157
|
+
return [4 /*yield*/, this.evalute(ast.key)];
|
|
158
|
+
case 2:
|
|
159
|
+
key = _b.sent();
|
|
160
|
+
if (typeof key === 'undefined' && ((_a = ast.key) === null || _a === void 0 ? void 0 : _a.type) === 'variable') {
|
|
161
|
+
key = ast.key.name;
|
|
162
|
+
}
|
|
163
|
+
return [2 /*return*/, host === null || host === void 0 ? void 0 : host[key]];
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
// 位操作如 +2 ~3 !
|
|
169
|
+
AsyncEvaluator.prototype.unary = function (ast) {
|
|
170
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
171
|
+
var value;
|
|
172
|
+
return __generator(this, function (_a) {
|
|
173
|
+
switch (_a.label) {
|
|
174
|
+
case 0: return [4 /*yield*/, this.evalute(ast.value)];
|
|
175
|
+
case 1:
|
|
176
|
+
value = _a.sent();
|
|
177
|
+
switch (ast.op) {
|
|
178
|
+
case '+':
|
|
179
|
+
return [2 /*return*/, +value];
|
|
180
|
+
case '-':
|
|
181
|
+
return [2 /*return*/, -value];
|
|
182
|
+
case '~':
|
|
183
|
+
return [2 /*return*/, ~value];
|
|
184
|
+
case '!':
|
|
185
|
+
return [2 /*return*/, !value];
|
|
186
|
+
}
|
|
187
|
+
return [2 /*return*/];
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
AsyncEvaluator.prototype.power = function (ast) {
|
|
193
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
194
|
+
var left, right;
|
|
195
|
+
return __generator(this, function (_a) {
|
|
196
|
+
switch (_a.label) {
|
|
197
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
198
|
+
case 1:
|
|
199
|
+
left = _a.sent();
|
|
200
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
201
|
+
case 2:
|
|
202
|
+
right = _a.sent();
|
|
203
|
+
return [2 /*return*/, Math.pow(this.formatNumber(left), this.formatNumber(right))];
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
AsyncEvaluator.prototype.multiply = function (ast) {
|
|
209
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
210
|
+
var left, right;
|
|
211
|
+
return __generator(this, function (_a) {
|
|
212
|
+
switch (_a.label) {
|
|
213
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
214
|
+
case 1:
|
|
215
|
+
left = _a.sent();
|
|
216
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
217
|
+
case 2:
|
|
218
|
+
right = _a.sent();
|
|
219
|
+
return [2 /*return*/, stripNumber(this.formatNumber(left) * this.formatNumber(right))];
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
AsyncEvaluator.prototype.divide = function (ast) {
|
|
225
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
226
|
+
var left, right;
|
|
227
|
+
return __generator(this, function (_a) {
|
|
228
|
+
switch (_a.label) {
|
|
229
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
230
|
+
case 1:
|
|
231
|
+
left = _a.sent();
|
|
232
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
233
|
+
case 2:
|
|
234
|
+
right = _a.sent();
|
|
235
|
+
return [2 /*return*/, stripNumber(this.formatNumber(left) / this.formatNumber(right))];
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
};
|
|
240
|
+
AsyncEvaluator.prototype.remainder = function (ast) {
|
|
241
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
242
|
+
var left, right;
|
|
243
|
+
return __generator(this, function (_a) {
|
|
244
|
+
switch (_a.label) {
|
|
245
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
246
|
+
case 1:
|
|
247
|
+
left = _a.sent();
|
|
248
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
249
|
+
case 2:
|
|
250
|
+
right = _a.sent();
|
|
251
|
+
return [2 /*return*/, this.formatNumber(left) % this.formatNumber(right)];
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
AsyncEvaluator.prototype.add = function (ast) {
|
|
257
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
258
|
+
var left, right;
|
|
259
|
+
return __generator(this, function (_a) {
|
|
260
|
+
switch (_a.label) {
|
|
261
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
262
|
+
case 1:
|
|
263
|
+
left = _a.sent();
|
|
264
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
265
|
+
case 2:
|
|
266
|
+
right = _a.sent();
|
|
267
|
+
// 如果有一个不是数字就变成字符串拼接
|
|
268
|
+
if (isNaN(left) || isNaN(right)) {
|
|
269
|
+
return [2 /*return*/, left + right];
|
|
270
|
+
}
|
|
271
|
+
return [2 /*return*/, stripNumber(this.formatNumber(left) + this.formatNumber(right))];
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
AsyncEvaluator.prototype.minus = function (ast) {
|
|
277
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
278
|
+
var left, right;
|
|
279
|
+
return __generator(this, function (_a) {
|
|
280
|
+
switch (_a.label) {
|
|
281
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
282
|
+
case 1:
|
|
283
|
+
left = _a.sent();
|
|
284
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
285
|
+
case 2:
|
|
286
|
+
right = _a.sent();
|
|
287
|
+
return [2 /*return*/, stripNumber(this.formatNumber(left) - this.formatNumber(right))];
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
AsyncEvaluator.prototype.shift = function (ast) {
|
|
293
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
294
|
+
var left, right;
|
|
295
|
+
return __generator(this, function (_a) {
|
|
296
|
+
switch (_a.label) {
|
|
297
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
298
|
+
case 1:
|
|
299
|
+
left = _a.sent();
|
|
300
|
+
return [4 /*yield*/, this.formatNumber(this.evalute(ast.right), true)];
|
|
301
|
+
case 2:
|
|
302
|
+
right = _a.sent();
|
|
303
|
+
if (ast.op === '<<') {
|
|
304
|
+
return [2 /*return*/, left << right];
|
|
305
|
+
}
|
|
306
|
+
else if (ast.op == '>>') {
|
|
307
|
+
return [2 /*return*/, left >> right];
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
return [2 /*return*/, left >>> right];
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
};
|
|
316
|
+
AsyncEvaluator.prototype.lt = function (ast) {
|
|
317
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
318
|
+
var left, right;
|
|
319
|
+
return __generator(this, function (_a) {
|
|
320
|
+
switch (_a.label) {
|
|
321
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
322
|
+
case 1:
|
|
323
|
+
left = _a.sent();
|
|
324
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
325
|
+
case 2:
|
|
326
|
+
right = _a.sent();
|
|
327
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
328
|
+
return [2 /*return*/, left < right];
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
};
|
|
333
|
+
AsyncEvaluator.prototype.gt = function (ast) {
|
|
334
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
335
|
+
var left, right;
|
|
336
|
+
return __generator(this, function (_a) {
|
|
337
|
+
switch (_a.label) {
|
|
338
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
339
|
+
case 1:
|
|
340
|
+
left = _a.sent();
|
|
341
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
342
|
+
case 2:
|
|
343
|
+
right = _a.sent();
|
|
344
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
345
|
+
return [2 /*return*/, left > right];
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
};
|
|
350
|
+
AsyncEvaluator.prototype.le = function (ast) {
|
|
351
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
352
|
+
var left, right;
|
|
353
|
+
return __generator(this, function (_a) {
|
|
354
|
+
switch (_a.label) {
|
|
355
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
356
|
+
case 1:
|
|
357
|
+
left = _a.sent();
|
|
358
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
359
|
+
case 2:
|
|
360
|
+
right = _a.sent();
|
|
361
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
362
|
+
return [2 /*return*/, left <= right];
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
};
|
|
367
|
+
AsyncEvaluator.prototype.ge = function (ast) {
|
|
368
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
369
|
+
var left, right;
|
|
370
|
+
return __generator(this, function (_a) {
|
|
371
|
+
switch (_a.label) {
|
|
372
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
373
|
+
case 1:
|
|
374
|
+
left = _a.sent();
|
|
375
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
376
|
+
case 2:
|
|
377
|
+
right = _a.sent();
|
|
378
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
379
|
+
return [2 /*return*/, left >= right];
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
};
|
|
384
|
+
AsyncEvaluator.prototype.eq = function (ast) {
|
|
385
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
386
|
+
var left, right;
|
|
387
|
+
return __generator(this, function (_a) {
|
|
388
|
+
switch (_a.label) {
|
|
389
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
390
|
+
case 1:
|
|
391
|
+
left = _a.sent();
|
|
392
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
393
|
+
case 2:
|
|
394
|
+
right = _a.sent();
|
|
395
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
396
|
+
return [2 /*return*/, left == right];
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
};
|
|
401
|
+
AsyncEvaluator.prototype.ne = function (ast) {
|
|
402
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
403
|
+
var left, right;
|
|
404
|
+
return __generator(this, function (_a) {
|
|
405
|
+
switch (_a.label) {
|
|
406
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
407
|
+
case 1:
|
|
408
|
+
left = _a.sent();
|
|
409
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
410
|
+
case 2:
|
|
411
|
+
right = _a.sent();
|
|
412
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
413
|
+
return [2 /*return*/, left != right];
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
};
|
|
418
|
+
AsyncEvaluator.prototype.streq = function (ast) {
|
|
419
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
420
|
+
var left, right;
|
|
421
|
+
return __generator(this, function (_a) {
|
|
422
|
+
switch (_a.label) {
|
|
423
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
424
|
+
case 1:
|
|
425
|
+
left = _a.sent();
|
|
426
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
427
|
+
case 2:
|
|
428
|
+
right = _a.sent();
|
|
429
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
430
|
+
return [2 /*return*/, left === right];
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
});
|
|
434
|
+
};
|
|
435
|
+
AsyncEvaluator.prototype.strneq = function (ast) {
|
|
436
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
437
|
+
var left, right;
|
|
438
|
+
return __generator(this, function (_a) {
|
|
439
|
+
switch (_a.label) {
|
|
440
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
441
|
+
case 1:
|
|
442
|
+
left = _a.sent();
|
|
443
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
444
|
+
case 2:
|
|
445
|
+
right = _a.sent();
|
|
446
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
447
|
+
return [2 /*return*/, left !== right];
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
};
|
|
452
|
+
AsyncEvaluator.prototype.binary = function (ast) {
|
|
453
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
454
|
+
var left, right;
|
|
455
|
+
return __generator(this, function (_a) {
|
|
456
|
+
switch (_a.label) {
|
|
457
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
458
|
+
case 1:
|
|
459
|
+
left = _a.sent();
|
|
460
|
+
return [4 /*yield*/, this.evalute(ast.right)];
|
|
461
|
+
case 2:
|
|
462
|
+
right = _a.sent();
|
|
463
|
+
if (ast.op === '&') {
|
|
464
|
+
return [2 /*return*/, left & right];
|
|
465
|
+
}
|
|
466
|
+
else if (ast.op === '^') {
|
|
467
|
+
return [2 /*return*/, left ^ right];
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
return [2 /*return*/, left | right];
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
});
|
|
474
|
+
});
|
|
475
|
+
};
|
|
476
|
+
AsyncEvaluator.prototype.and = function (ast) {
|
|
477
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
478
|
+
var left;
|
|
479
|
+
return __generator(this, function (_a) {
|
|
480
|
+
switch (_a.label) {
|
|
481
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
482
|
+
case 1:
|
|
483
|
+
left = _a.sent();
|
|
484
|
+
return [2 /*return*/, left && this.evalute(ast.right)];
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
};
|
|
489
|
+
AsyncEvaluator.prototype.or = function (ast) {
|
|
490
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
491
|
+
var left;
|
|
492
|
+
return __generator(this, function (_a) {
|
|
493
|
+
switch (_a.label) {
|
|
494
|
+
case 0: return [4 /*yield*/, this.evalute(ast.left)];
|
|
495
|
+
case 1:
|
|
496
|
+
left = _a.sent();
|
|
497
|
+
return [2 /*return*/, left || this.evalute(ast.right)];
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
};
|
|
502
|
+
AsyncEvaluator.prototype.array = function (ast) {
|
|
503
|
+
var _this = this;
|
|
504
|
+
return runSequence(ast.members, function (member) { return _this.evalute(member); });
|
|
505
|
+
};
|
|
506
|
+
AsyncEvaluator.prototype.object = function (ast) {
|
|
507
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
508
|
+
var object;
|
|
509
|
+
var _this = this;
|
|
510
|
+
return __generator(this, function (_a) {
|
|
511
|
+
switch (_a.label) {
|
|
512
|
+
case 0:
|
|
513
|
+
object = {};
|
|
514
|
+
return [4 /*yield*/, ast.members.reduce(function (promise, _a, index) {
|
|
515
|
+
var key = _a.key, value = _a.value;
|
|
516
|
+
return __awaiter(_this, void 0, void 0, function () {
|
|
517
|
+
var objKey, objVal;
|
|
518
|
+
return __generator(this, function (_b) {
|
|
519
|
+
switch (_b.label) {
|
|
520
|
+
case 0: return [4 /*yield*/, promise];
|
|
521
|
+
case 1:
|
|
522
|
+
_b.sent();
|
|
523
|
+
return [4 /*yield*/, this.evalute(key)];
|
|
524
|
+
case 2:
|
|
525
|
+
objKey = _b.sent();
|
|
526
|
+
return [4 /*yield*/, this.evalute(value)];
|
|
527
|
+
case 3:
|
|
528
|
+
objVal = _b.sent();
|
|
529
|
+
object[objKey] = objVal;
|
|
530
|
+
return [2 /*return*/];
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
});
|
|
534
|
+
}, Promise.resolve())];
|
|
535
|
+
case 1:
|
|
536
|
+
_a.sent();
|
|
537
|
+
return [2 /*return*/, object];
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
};
|
|
542
|
+
AsyncEvaluator.prototype.conditional = function (ast) {
|
|
543
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
544
|
+
var _a;
|
|
545
|
+
return __generator(this, function (_b) {
|
|
546
|
+
switch (_b.label) {
|
|
547
|
+
case 0: return [4 /*yield*/, this.evalute(ast.test)];
|
|
548
|
+
case 1:
|
|
549
|
+
if (!(_b.sent())) return [3 /*break*/, 3];
|
|
550
|
+
return [4 /*yield*/, this.evalute(ast.consequent)];
|
|
551
|
+
case 2:
|
|
552
|
+
_a = _b.sent();
|
|
553
|
+
return [3 /*break*/, 5];
|
|
554
|
+
case 3: return [4 /*yield*/, this.evalute(ast.alternate)];
|
|
555
|
+
case 4:
|
|
556
|
+
_a = _b.sent();
|
|
557
|
+
_b.label = 5;
|
|
558
|
+
case 5: return [2 /*return*/, _a];
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
});
|
|
562
|
+
};
|
|
563
|
+
AsyncEvaluator.prototype.funcCall = function (ast) {
|
|
564
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
565
|
+
var fnName, fn, args;
|
|
566
|
+
var _this = this;
|
|
567
|
+
return __generator(this, function (_a) {
|
|
568
|
+
switch (_a.label) {
|
|
569
|
+
case 0:
|
|
570
|
+
fnName = "fn".concat(ast.identifier);
|
|
571
|
+
fn = this.functions[fnName] ||
|
|
572
|
+
this[fnName] ||
|
|
573
|
+
(this.filters.hasOwnProperty(ast.identifier) &&
|
|
574
|
+
this.filters[ast.identifier]);
|
|
575
|
+
if (!fn) {
|
|
576
|
+
throw new Error("".concat(ast.identifier, "\u51FD\u6570\u6CA1\u6709\u5B9A\u4E49"));
|
|
577
|
+
}
|
|
578
|
+
args = ast.args;
|
|
579
|
+
if (!~['IF', 'AND', 'OR', 'XOR', 'IFS'].indexOf(ast.identifier)) return [3 /*break*/, 1];
|
|
580
|
+
args = args.map(function (a) { return function () { return _this.evalute(a); }; });
|
|
581
|
+
return [3 /*break*/, 3];
|
|
582
|
+
case 1: return [4 /*yield*/, runSequence(args, function (a) { return _this.evalute(a); })];
|
|
583
|
+
case 2:
|
|
584
|
+
args = _a.sent();
|
|
585
|
+
_a.label = 3;
|
|
586
|
+
case 3: return [2 /*return*/, fn.apply(this, args)];
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
};
|
|
591
|
+
AsyncEvaluator.prototype.callAnonymousFunction = function (ast, args) {
|
|
592
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
593
|
+
var ctx, result;
|
|
594
|
+
return __generator(this, function (_a) {
|
|
595
|
+
switch (_a.label) {
|
|
596
|
+
case 0:
|
|
597
|
+
ctx = createObject(this.contextStack[this.contextStack.length - 1]('&') || {}, {});
|
|
598
|
+
ast.args.forEach(function (arg) {
|
|
599
|
+
if (arg.type !== 'variable') {
|
|
600
|
+
throw new Error('expected a variable as argument');
|
|
601
|
+
}
|
|
602
|
+
ctx[arg.name] = args.shift();
|
|
603
|
+
});
|
|
604
|
+
this.contextStack.push(function (varName) {
|
|
605
|
+
return varName === '&' ? ctx : ctx[varName];
|
|
606
|
+
});
|
|
607
|
+
return [4 /*yield*/, this.evalute(ast.return)];
|
|
608
|
+
case 1:
|
|
609
|
+
result = _a.sent();
|
|
610
|
+
this.contextStack.pop();
|
|
611
|
+
return [2 /*return*/, result];
|
|
612
|
+
}
|
|
613
|
+
});
|
|
614
|
+
});
|
|
615
|
+
};
|
|
616
|
+
/**
|
|
617
|
+
* 示例:IF(A, B, C)
|
|
618
|
+
*
|
|
619
|
+
* 如果满足条件A,则返回B,否则返回C,支持多层嵌套IF函数。
|
|
620
|
+
*
|
|
621
|
+
* 也可以用表达式如:A ? B : C
|
|
622
|
+
*
|
|
623
|
+
* @example IF(condition, consequent, alternate)
|
|
624
|
+
* @param {expression} condition - 条件表达式.
|
|
625
|
+
* @param {any} consequent 条件判断通过的返回结果
|
|
626
|
+
* @param {any} alternate 条件判断不通过的返回结果
|
|
627
|
+
* @namespace 逻辑函数
|
|
628
|
+
*
|
|
629
|
+
* @returns {any} 根据条件返回不同的结果
|
|
630
|
+
*/
|
|
631
|
+
AsyncEvaluator.prototype.fnIF = function (condition, trueValue, falseValue) {
|
|
632
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
633
|
+
var _a;
|
|
634
|
+
return __generator(this, function (_b) {
|
|
635
|
+
switch (_b.label) {
|
|
636
|
+
case 0: return [4 /*yield*/, condition()];
|
|
637
|
+
case 1:
|
|
638
|
+
if (!(_b.sent())) return [3 /*break*/, 3];
|
|
639
|
+
return [4 /*yield*/, trueValue()];
|
|
640
|
+
case 2:
|
|
641
|
+
_a = _b.sent();
|
|
642
|
+
return [3 /*break*/, 5];
|
|
643
|
+
case 3: return [4 /*yield*/, falseValue()];
|
|
644
|
+
case 4:
|
|
645
|
+
_a = _b.sent();
|
|
646
|
+
_b.label = 5;
|
|
647
|
+
case 5: return [2 /*return*/, _a];
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
});
|
|
651
|
+
};
|
|
652
|
+
/**
|
|
653
|
+
* 条件全部符合,返回 true,否则返回 false
|
|
654
|
+
*
|
|
655
|
+
* 示例:AND(语文成绩>80, 数学成绩>80)
|
|
656
|
+
*
|
|
657
|
+
* 语文成绩和数学成绩都大于 80,则返回 true,否则返回 false
|
|
658
|
+
*
|
|
659
|
+
* 也可以直接用表达式如:语文成绩>80 && 数学成绩>80
|
|
660
|
+
*
|
|
661
|
+
* @example AND(expression1, expression2, ...expressionN)
|
|
662
|
+
* @param {...expression} conditions - 条件表达式.
|
|
663
|
+
* @namespace 逻辑函数
|
|
664
|
+
*
|
|
665
|
+
* @returns {boolean}
|
|
666
|
+
*/
|
|
667
|
+
AsyncEvaluator.prototype.fnAND = function () {
|
|
668
|
+
var condtions = [];
|
|
669
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
670
|
+
condtions[_i] = arguments[_i];
|
|
671
|
+
}
|
|
672
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
673
|
+
var _this = this;
|
|
674
|
+
return __generator(this, function (_a) {
|
|
675
|
+
if (!condtions.length) {
|
|
676
|
+
return [2 /*return*/, false];
|
|
677
|
+
}
|
|
678
|
+
return [2 /*return*/, condtions.reduce(function (promise, c) { return __awaiter(_this, void 0, void 0, function () {
|
|
679
|
+
var result;
|
|
680
|
+
return __generator(this, function (_a) {
|
|
681
|
+
switch (_a.label) {
|
|
682
|
+
case 0: return [4 /*yield*/, promise];
|
|
683
|
+
case 1:
|
|
684
|
+
result = _a.sent();
|
|
685
|
+
if (result) {
|
|
686
|
+
return [2 /*return*/, c()];
|
|
687
|
+
}
|
|
688
|
+
return [2 /*return*/, result];
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
}); }, Promise.resolve(true))];
|
|
692
|
+
});
|
|
693
|
+
});
|
|
694
|
+
};
|
|
695
|
+
/**
|
|
696
|
+
* 条件任意一个满足条件,返回 true,否则返回 false
|
|
697
|
+
*
|
|
698
|
+
* 示例:OR(语文成绩>80, 数学成绩>80)
|
|
699
|
+
*
|
|
700
|
+
* 语文成绩和数学成绩任意一个大于 80,则返回 true,否则返回 false
|
|
701
|
+
*
|
|
702
|
+
* 也可以直接用表达式如:语文成绩>80 || 数学成绩>80
|
|
703
|
+
*
|
|
704
|
+
* @example OR(expression1, expression2, ...expressionN)
|
|
705
|
+
* @param {...expression} conditions - 条件表达式.
|
|
706
|
+
* @namespace 逻辑函数
|
|
707
|
+
*
|
|
708
|
+
* @returns {boolean}
|
|
709
|
+
*/
|
|
710
|
+
AsyncEvaluator.prototype.fnOR = function () {
|
|
711
|
+
var condtions = [];
|
|
712
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
713
|
+
condtions[_i] = arguments[_i];
|
|
714
|
+
}
|
|
715
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
716
|
+
var _this = this;
|
|
717
|
+
return __generator(this, function (_a) {
|
|
718
|
+
if (!condtions.length) {
|
|
719
|
+
return [2 /*return*/, false];
|
|
720
|
+
}
|
|
721
|
+
return [2 /*return*/, condtions.reduce(function (promise, c) { return __awaiter(_this, void 0, void 0, function () {
|
|
722
|
+
var result;
|
|
723
|
+
return __generator(this, function (_a) {
|
|
724
|
+
switch (_a.label) {
|
|
725
|
+
case 0: return [4 /*yield*/, promise];
|
|
726
|
+
case 1:
|
|
727
|
+
result = _a.sent();
|
|
728
|
+
if (result) {
|
|
729
|
+
return [2 /*return*/, true];
|
|
730
|
+
}
|
|
731
|
+
return [2 /*return*/, c()];
|
|
732
|
+
}
|
|
733
|
+
});
|
|
734
|
+
}); }, Promise.resolve(false))];
|
|
735
|
+
});
|
|
736
|
+
});
|
|
737
|
+
};
|
|
738
|
+
/**
|
|
739
|
+
* 异或处理,多个表达式组中存在奇数个真时认为真。
|
|
740
|
+
*
|
|
741
|
+
* @example XOR(condition1, condition2)
|
|
742
|
+
* @param {expression} condition1 - 条件表达式1
|
|
743
|
+
* @param {expression} condition2 - 条件表达式2
|
|
744
|
+
* @namespace 逻辑函数
|
|
745
|
+
*
|
|
746
|
+
* @returns {boolean}
|
|
747
|
+
*/
|
|
748
|
+
AsyncEvaluator.prototype.fnXOR = function () {
|
|
749
|
+
var condtions = [];
|
|
750
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
751
|
+
condtions[_i] = arguments[_i];
|
|
752
|
+
}
|
|
753
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
754
|
+
return __generator(this, function (_a) {
|
|
755
|
+
switch (_a.label) {
|
|
756
|
+
case 0:
|
|
757
|
+
if (!condtions.length) {
|
|
758
|
+
return [2 /*return*/, false];
|
|
759
|
+
}
|
|
760
|
+
return [4 /*yield*/, runSequence(condtions, function (c) { return c(); })];
|
|
761
|
+
case 1: return [2 /*return*/, !!((_a.sent()).filter(function (item) { return item; }).length % 2)];
|
|
762
|
+
}
|
|
763
|
+
});
|
|
764
|
+
});
|
|
765
|
+
};
|
|
766
|
+
/**
|
|
767
|
+
* 判断函数集合,相当于多个 else if 合并成一个。
|
|
768
|
+
*
|
|
769
|
+
* 示例:IFS(语文成绩 > 80, "优秀", 语文成绩 > 60, "良", "继续努力")
|
|
770
|
+
*
|
|
771
|
+
* 如果语文成绩大于 80,则返回优秀,否则判断大于 60 分,则返回良,否则返回继续努力。
|
|
772
|
+
*
|
|
773
|
+
* @example IFS(condition1, result1, condition2, result2,...conditionN, resultN)
|
|
774
|
+
* @param {...any} args - 条件,返回值集合
|
|
775
|
+
* @namespace 逻辑函数
|
|
776
|
+
* @returns {any} 第一个满足条件的结果,没有命中的返回 false。
|
|
777
|
+
*/
|
|
778
|
+
AsyncEvaluator.prototype.fnIFS = function () {
|
|
779
|
+
var args = [];
|
|
780
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
781
|
+
args[_i] = arguments[_i];
|
|
782
|
+
}
|
|
783
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
784
|
+
var c, v;
|
|
785
|
+
return __generator(this, function (_a) {
|
|
786
|
+
switch (_a.label) {
|
|
787
|
+
case 0:
|
|
788
|
+
if (args.length % 2) {
|
|
789
|
+
args.splice(args.length - 1, 0, function () { return true; });
|
|
790
|
+
}
|
|
791
|
+
_a.label = 1;
|
|
792
|
+
case 1:
|
|
793
|
+
if (!args.length) return [3 /*break*/, 5];
|
|
794
|
+
c = args.shift();
|
|
795
|
+
v = args.shift();
|
|
796
|
+
return [4 /*yield*/, c()];
|
|
797
|
+
case 2:
|
|
798
|
+
if (!_a.sent()) return [3 /*break*/, 4];
|
|
799
|
+
return [4 /*yield*/, v()];
|
|
800
|
+
case 3: return [2 /*return*/, _a.sent()];
|
|
801
|
+
case 4: return [3 /*break*/, 1];
|
|
802
|
+
case 5: return [2 /*return*/];
|
|
803
|
+
}
|
|
804
|
+
});
|
|
805
|
+
});
|
|
806
|
+
};
|
|
807
|
+
/**
|
|
808
|
+
* 数组做数据转换,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
|
|
809
|
+
*
|
|
810
|
+
* @param {Array<any>} arr 数组
|
|
811
|
+
* @param {Function<any>} iterator 箭头函数
|
|
812
|
+
* @namespace 数组
|
|
813
|
+
* @example ARRAYMAP(arr, item => item)
|
|
814
|
+
* @returns {boolean} 结果
|
|
815
|
+
*/
|
|
816
|
+
AsyncEvaluator.prototype.fnARRAYMAP = function (value, iterator) {
|
|
817
|
+
var _this = this;
|
|
818
|
+
if (!iterator || iterator.type !== 'anonymous_function') {
|
|
819
|
+
throw new Error('expected an anonymous function get ' + iterator);
|
|
820
|
+
}
|
|
821
|
+
return (Array.isArray(value) ? value : []).reduce(function (promise, item, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
822
|
+
var arr, _a, _b;
|
|
823
|
+
return __generator(this, function (_c) {
|
|
824
|
+
switch (_c.label) {
|
|
825
|
+
case 0: return [4 /*yield*/, promise];
|
|
826
|
+
case 1:
|
|
827
|
+
arr = _c.sent();
|
|
828
|
+
_b = (_a = arr).push;
|
|
829
|
+
return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
|
|
830
|
+
case 2:
|
|
831
|
+
_b.apply(_a, [_c.sent()]);
|
|
832
|
+
return [2 /*return*/, arr];
|
|
833
|
+
}
|
|
834
|
+
});
|
|
835
|
+
}); }, Promise.resolve([]));
|
|
836
|
+
};
|
|
837
|
+
/**
|
|
838
|
+
* 数据做数据过滤,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
|
|
839
|
+
* 将第二个箭头函数返回为 false 的成员过滤掉。
|
|
840
|
+
*
|
|
841
|
+
* @param {Array<any>} arr 数组
|
|
842
|
+
* @param {Function<any>} iterator 箭头函数
|
|
843
|
+
* @namespace 数组
|
|
844
|
+
* @example ARRAYFILTER(arr, item => item)
|
|
845
|
+
* @returns {boolean} 结果
|
|
846
|
+
*/
|
|
847
|
+
AsyncEvaluator.prototype.fnARRAYFILTER = function (value, iterator) {
|
|
848
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
849
|
+
var _this = this;
|
|
850
|
+
return __generator(this, function (_a) {
|
|
851
|
+
switch (_a.label) {
|
|
852
|
+
case 0:
|
|
853
|
+
if (!iterator || iterator.type !== 'anonymous_function') {
|
|
854
|
+
throw new Error('expected an anonymous function get ' + iterator);
|
|
855
|
+
}
|
|
856
|
+
return [4 /*yield*/, (Array.isArray(value) ? value : []).reduce(function (promise, item, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
857
|
+
var arr, hit;
|
|
858
|
+
return __generator(this, function (_a) {
|
|
859
|
+
switch (_a.label) {
|
|
860
|
+
case 0: return [4 /*yield*/, promise];
|
|
861
|
+
case 1:
|
|
862
|
+
arr = _a.sent();
|
|
863
|
+
return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
|
|
864
|
+
case 2:
|
|
865
|
+
hit = _a.sent();
|
|
866
|
+
if (hit) {
|
|
867
|
+
arr.push(item);
|
|
868
|
+
}
|
|
869
|
+
return [2 /*return*/, arr];
|
|
870
|
+
}
|
|
871
|
+
});
|
|
872
|
+
}); }, Promise.resolve([]))];
|
|
873
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
874
|
+
}
|
|
875
|
+
});
|
|
876
|
+
});
|
|
877
|
+
};
|
|
878
|
+
/**
|
|
879
|
+
* 数据做数据查找,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
|
|
880
|
+
* 找出第二个箭头函数返回为 true 的成员的索引。
|
|
881
|
+
*
|
|
882
|
+
* 示例:
|
|
883
|
+
*
|
|
884
|
+
* ARRAYFINDINDEX([0, 2, false], item => item === 2) 得到 1
|
|
885
|
+
*
|
|
886
|
+
* @param {Array<any>} arr 数组
|
|
887
|
+
* @param {Function<any>} iterator 箭头函数
|
|
888
|
+
* @namespace 数组
|
|
889
|
+
* @example ARRAYFINDINDEX(arr, item => item === 2)
|
|
890
|
+
* @returns {number} 结果
|
|
891
|
+
*/
|
|
892
|
+
AsyncEvaluator.prototype.fnARRAYFINDINDEX = function (arr, iterator) {
|
|
893
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
894
|
+
var hitIndex;
|
|
895
|
+
var _this = this;
|
|
896
|
+
return __generator(this, function (_a) {
|
|
897
|
+
switch (_a.label) {
|
|
898
|
+
case 0:
|
|
899
|
+
if (!iterator || iterator.type !== 'anonymous_function') {
|
|
900
|
+
throw new Error('expected an anonymous function get ' + iterator);
|
|
901
|
+
}
|
|
902
|
+
hitIndex = -1;
|
|
903
|
+
return [4 /*yield*/, (Array.isArray(arr) ? arr : []).reduce(function (promise, item, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
904
|
+
var hit;
|
|
905
|
+
return __generator(this, function (_a) {
|
|
906
|
+
switch (_a.label) {
|
|
907
|
+
case 0: return [4 /*yield*/, promise];
|
|
908
|
+
case 1:
|
|
909
|
+
_a.sent();
|
|
910
|
+
return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
|
|
911
|
+
case 2:
|
|
912
|
+
hit = _a.sent();
|
|
913
|
+
if (hit) {
|
|
914
|
+
hitIndex = index;
|
|
915
|
+
}
|
|
916
|
+
return [2 /*return*/];
|
|
917
|
+
}
|
|
918
|
+
});
|
|
919
|
+
}); }, Promise.resolve())];
|
|
920
|
+
case 1:
|
|
921
|
+
_a.sent();
|
|
922
|
+
return [2 /*return*/, hitIndex];
|
|
923
|
+
}
|
|
924
|
+
});
|
|
925
|
+
});
|
|
926
|
+
};
|
|
927
|
+
/**
|
|
928
|
+
* 数据做数据查找,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
|
|
929
|
+
* 找出第二个箭头函数返回为 true 的成员。
|
|
930
|
+
*
|
|
931
|
+
* 示例:
|
|
932
|
+
*
|
|
933
|
+
* ARRAYFIND([0, 2, false], item => item === 2) 得到 2
|
|
934
|
+
*
|
|
935
|
+
* @param {Array<any>} arr 数组
|
|
936
|
+
* @param {Function<any>} iterator 箭头函数
|
|
937
|
+
* @namespace 数组
|
|
938
|
+
* @example ARRAYFIND(arr, item => item === 2)
|
|
939
|
+
* @returns {any} 结果
|
|
940
|
+
*/
|
|
941
|
+
AsyncEvaluator.prototype.fnARRAYFIND = function (arr, iterator) {
|
|
942
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
943
|
+
var hitItem;
|
|
944
|
+
var _this = this;
|
|
945
|
+
return __generator(this, function (_a) {
|
|
946
|
+
switch (_a.label) {
|
|
947
|
+
case 0:
|
|
948
|
+
if (!iterator || iterator.type !== 'anonymous_function') {
|
|
949
|
+
throw new Error('expected an anonymous function get ' + iterator);
|
|
950
|
+
}
|
|
951
|
+
hitItem = undefined;
|
|
952
|
+
return [4 /*yield*/, (Array.isArray(arr) ? arr : []).reduce(function (promise, item, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
953
|
+
var hit;
|
|
954
|
+
return __generator(this, function (_a) {
|
|
955
|
+
switch (_a.label) {
|
|
956
|
+
case 0: return [4 /*yield*/, promise];
|
|
957
|
+
case 1:
|
|
958
|
+
_a.sent();
|
|
959
|
+
return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
|
|
960
|
+
case 2:
|
|
961
|
+
hit = _a.sent();
|
|
962
|
+
if (hit) {
|
|
963
|
+
hitItem = item;
|
|
964
|
+
}
|
|
965
|
+
return [2 /*return*/];
|
|
966
|
+
}
|
|
967
|
+
});
|
|
968
|
+
}); }, Promise.resolve())];
|
|
969
|
+
case 1:
|
|
970
|
+
_a.sent();
|
|
971
|
+
return [2 /*return*/, hitItem];
|
|
972
|
+
}
|
|
973
|
+
});
|
|
974
|
+
});
|
|
975
|
+
};
|
|
976
|
+
/**
|
|
977
|
+
* 数据做数据遍历判断,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
|
|
978
|
+
* 判断第二个箭头函数是否存在返回为 true 的成员。
|
|
979
|
+
*
|
|
980
|
+
* 示例:
|
|
981
|
+
*
|
|
982
|
+
* ARRAYSOME([0, 2, false], item => item === 2) 得到 true
|
|
983
|
+
*
|
|
984
|
+
* @param {Array<any>} arr 数组
|
|
985
|
+
* @param {Function<any>} iterator 箭头函数
|
|
986
|
+
* @namespace 数组
|
|
987
|
+
* @example ARRAYSOME(arr, item => item === 2)
|
|
988
|
+
* @returns {boolean} 结果
|
|
989
|
+
*/
|
|
990
|
+
AsyncEvaluator.prototype.fnARRAYSOME = function (arr, iterator) {
|
|
991
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
992
|
+
var result;
|
|
993
|
+
var _this = this;
|
|
994
|
+
return __generator(this, function (_a) {
|
|
995
|
+
switch (_a.label) {
|
|
996
|
+
case 0:
|
|
997
|
+
if (!iterator || iterator.type !== 'anonymous_function') {
|
|
998
|
+
throw new Error('expected an anonymous function get ' + iterator);
|
|
999
|
+
}
|
|
1000
|
+
return [4 /*yield*/, (Array.isArray(arr) ? arr : []).reduce(function (promise, item, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
1001
|
+
var prev, hit;
|
|
1002
|
+
return __generator(this, function (_a) {
|
|
1003
|
+
switch (_a.label) {
|
|
1004
|
+
case 0: return [4 /*yield*/, promise];
|
|
1005
|
+
case 1:
|
|
1006
|
+
prev = _a.sent();
|
|
1007
|
+
return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
|
|
1008
|
+
case 2:
|
|
1009
|
+
hit = _a.sent();
|
|
1010
|
+
return [2 /*return*/, prev || hit];
|
|
1011
|
+
}
|
|
1012
|
+
});
|
|
1013
|
+
}); }, Promise.resolve(false))];
|
|
1014
|
+
case 1:
|
|
1015
|
+
result = _a.sent();
|
|
1016
|
+
return [2 /*return*/, result];
|
|
1017
|
+
}
|
|
1018
|
+
});
|
|
1019
|
+
});
|
|
1020
|
+
};
|
|
1021
|
+
/**
|
|
1022
|
+
* 数据做数据遍历判断,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
|
|
1023
|
+
* 判断第二个箭头函数返回是否都为 true。
|
|
1024
|
+
*
|
|
1025
|
+
* 示例:
|
|
1026
|
+
*
|
|
1027
|
+
* ARRAYEVERY([0, 2, false], item => item === 2) 得到 false
|
|
1028
|
+
*
|
|
1029
|
+
* @param {Array<any>} arr 数组
|
|
1030
|
+
* @param {Function<any>} iterator 箭头函数
|
|
1031
|
+
* @namespace 数组
|
|
1032
|
+
* @example ARRAYEVERY(arr, item => item === 2)
|
|
1033
|
+
* @returns {boolean} 结果
|
|
1034
|
+
*/
|
|
1035
|
+
AsyncEvaluator.prototype.fnARRAYEVERY = function (arr, iterator) {
|
|
1036
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1037
|
+
var result;
|
|
1038
|
+
var _this = this;
|
|
1039
|
+
return __generator(this, function (_a) {
|
|
1040
|
+
switch (_a.label) {
|
|
1041
|
+
case 0:
|
|
1042
|
+
if (!iterator || iterator.type !== 'anonymous_function') {
|
|
1043
|
+
throw new Error('expected an anonymous function get ' + iterator);
|
|
1044
|
+
}
|
|
1045
|
+
return [4 /*yield*/, (Array.isArray(arr) ? arr : []).reduce(function (promise, item, index) { return __awaiter(_this, void 0, void 0, function () {
|
|
1046
|
+
var prev, hit;
|
|
1047
|
+
return __generator(this, function (_a) {
|
|
1048
|
+
switch (_a.label) {
|
|
1049
|
+
case 0: return [4 /*yield*/, promise];
|
|
1050
|
+
case 1:
|
|
1051
|
+
prev = _a.sent();
|
|
1052
|
+
return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
|
|
1053
|
+
case 2:
|
|
1054
|
+
hit = _a.sent();
|
|
1055
|
+
return [2 /*return*/, prev && hit];
|
|
1056
|
+
}
|
|
1057
|
+
});
|
|
1058
|
+
}); }, Promise.resolve(true))];
|
|
1059
|
+
case 1:
|
|
1060
|
+
result = _a.sent();
|
|
1061
|
+
return [2 /*return*/, result];
|
|
1062
|
+
}
|
|
1063
|
+
});
|
|
1064
|
+
});
|
|
1065
|
+
};
|
|
1066
|
+
return AsyncEvaluator;
|
|
1067
|
+
}(Evaluator));
|
|
1068
|
+
|
|
1069
|
+
export { AsyncEvaluator, runSequence };
|