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.
@@ -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 };