@mojir/lits 2.1.21 → 2.1.22

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.
@@ -898,6 +898,91 @@ function approxEqual(a, b, epsilon) {
898
898
  function approxZero(value) {
899
899
  return Math.abs(value) < EPSILON;
900
900
  }
901
+ function paramCountAccepts(paramsCount, nbrOfParams) {
902
+ if (typeof paramsCount === 'number') {
903
+ return paramsCount === nbrOfParams;
904
+ }
905
+ var min = paramsCount.min, max = paramsCount.max, even = paramsCount.even, odd = paramsCount.odd;
906
+ if (even && nbrOfParams % 2 !== 0) {
907
+ return false;
908
+ }
909
+ if (odd && nbrOfParams % 2 !== 1) {
910
+ return false;
911
+ }
912
+ if (typeof min === 'number' && nbrOfParams < min) {
913
+ return false;
914
+ }
915
+ if (typeof max === 'number' && nbrOfParams > max) {
916
+ return false;
917
+ }
918
+ return true;
919
+ }
920
+ function paramCountAcceptsMin(paramsCount, nbrOfParams) {
921
+ if (typeof paramsCount === 'number') {
922
+ return nbrOfParams >= paramsCount;
923
+ }
924
+ var min = paramsCount.min;
925
+ if (typeof min === 'number' && nbrOfParams < min) {
926
+ return false;
927
+ }
928
+ return true;
929
+ }
930
+ function getCommonParamCount(params) {
931
+ return params.reduce(function (acc, param) {
932
+ if (acc === null) {
933
+ return null;
934
+ }
935
+ var paramCount = (typeof param === 'number' || isColl(param)) ? 1 : param.paramCount;
936
+ if (typeof acc === 'number' && typeof paramCount === 'number') {
937
+ return acc === paramCount ? acc : null;
938
+ }
939
+ if (typeof paramCount === 'number') {
940
+ if (paramCountAccepts(acc, paramCount)) {
941
+ return paramCount;
942
+ }
943
+ return null;
944
+ }
945
+ if (typeof acc === 'number') {
946
+ if (paramCountAccepts(paramCount, acc)) {
947
+ return acc;
948
+ }
949
+ return null;
950
+ }
951
+ var aMin = paramCount.min, aMax = paramCount.max, aEven = paramCount.even, aOdd = paramCount.odd;
952
+ var bMin = acc.min, bMax = acc.max, bEven = acc.even, bOdd = acc.odd;
953
+ var min = typeof aMin === 'number' && typeof bMin === 'number'
954
+ ? Math.max(aMin, bMin)
955
+ : typeof aMin === 'number' ? aMin : typeof bMin === 'number' ? bMin : undefined;
956
+ var max = typeof aMax === 'number' && typeof bMax === 'number'
957
+ ? Math.min(aMax, bMax)
958
+ : typeof aMax === 'number' ? aMax : typeof bMax === 'number' ? bMax : undefined;
959
+ var even = aEven !== null && aEven !== void 0 ? aEven : bEven;
960
+ var odd = aOdd !== null && aOdd !== void 0 ? aOdd : bOdd;
961
+ if (min !== undefined && max !== undefined && min > max) {
962
+ return null;
963
+ }
964
+ if (even && odd) {
965
+ return null;
966
+ }
967
+ if (odd && min !== undefined && min < 1) {
968
+ return null;
969
+ }
970
+ return { min: min, max: max, even: even, odd: odd };
971
+ }, {});
972
+ }
973
+ function getParamCount(param) {
974
+ return (typeof param === 'number' || isColl(param)) ? 1 : param.paramCount;
975
+ }
976
+ function paramCountMinus(paramCount, count) {
977
+ if (typeof paramCount === 'number') {
978
+ return paramCount - count;
979
+ }
980
+ var min = paramCount.min === undefined ? undefined : paramCount.min - count;
981
+ var max = paramCount.max === undefined ? undefined : paramCount.max - count;
982
+ var even = paramCount.even === undefined ? undefined : count % 2 === 0 ? true : undefined;
983
+ var odd = paramCount.odd === undefined ? undefined : count % 2 === 0 ? true : undefined;
984
+ return { min: min, max: max, even: even, odd: odd };
985
+ }
901
986
 
902
987
  // isArray not needed, use Array.isArary
903
988
  function asArray(value, sourceCodeInfo) {
@@ -4561,11 +4646,13 @@ var functionalNormalExpression = {
4561
4646
  'comp': {
4562
4647
  evaluate: function (params, sourceCodeInfo) {
4563
4648
  var _a;
4649
+ params.forEach(function (param) { return assertFunctionLike(param, sourceCodeInfo); });
4564
4650
  return _a = {},
4565
4651
  _a[FUNCTION_SYMBOL] = true,
4566
4652
  _a.sourceCodeInfo = sourceCodeInfo,
4567
4653
  _a.functionType = 'Comp',
4568
4654
  _a.params = params,
4655
+ _a.paramCount = params.length > 0 ? getParamCount(params.at(-1)) : 1,
4569
4656
  _a;
4570
4657
  },
4571
4658
  paramCount: {},
@@ -4579,6 +4666,7 @@ var functionalNormalExpression = {
4579
4666
  _b.sourceCodeInfo = sourceCodeInfo,
4580
4667
  _b.functionType = 'Constantly',
4581
4668
  _b.value = toAny(value),
4669
+ _b.paramCount = {},
4582
4670
  _b;
4583
4671
  },
4584
4672
  paramCount: 1,
@@ -4586,11 +4674,17 @@ var functionalNormalExpression = {
4586
4674
  'juxt': {
4587
4675
  evaluate: function (params, sourceCodeInfo) {
4588
4676
  var _a;
4677
+ params.forEach(function (param) { return assertFunctionLike(param, sourceCodeInfo); });
4678
+ var paramCount = getCommonParamCount(params);
4679
+ if (paramCount === null) {
4680
+ throw new LitsError('All functions must accept the same number of arguments', sourceCodeInfo);
4681
+ }
4589
4682
  return _a = {},
4590
4683
  _a[FUNCTION_SYMBOL] = true,
4591
4684
  _a.sourceCodeInfo = sourceCodeInfo,
4592
4685
  _a.functionType = 'Juxt',
4593
4686
  _a.params = params,
4687
+ _a.paramCount = paramCount,
4594
4688
  _a;
4595
4689
  },
4596
4690
  paramCount: { min: 1 },
@@ -4599,11 +4693,13 @@ var functionalNormalExpression = {
4599
4693
  evaluate: function (_a, sourceCodeInfo) {
4600
4694
  var _b;
4601
4695
  var _c = __read(_a, 1), fn = _c[0];
4696
+ var fun = asFunctionLike(fn, sourceCodeInfo);
4602
4697
  return _b = {},
4603
4698
  _b[FUNCTION_SYMBOL] = true,
4604
4699
  _b.sourceCodeInfo = sourceCodeInfo,
4605
4700
  _b.functionType = 'Complement',
4606
- _b.function = asFunctionLike(fn, sourceCodeInfo),
4701
+ _b.function = fun,
4702
+ _b.paramCount = getParamCount(fun),
4607
4703
  _b;
4608
4704
  },
4609
4705
  paramCount: 1,
@@ -4616,6 +4712,7 @@ var functionalNormalExpression = {
4616
4712
  _a.sourceCodeInfo = sourceCodeInfo,
4617
4713
  _a.functionType = 'EveryPred',
4618
4714
  _a.params = params,
4715
+ _a.paramCount = 1,
4619
4716
  _a;
4620
4717
  },
4621
4718
  paramCount: { min: 1 },
@@ -4628,6 +4725,7 @@ var functionalNormalExpression = {
4628
4725
  _a.sourceCodeInfo = sourceCodeInfo,
4629
4726
  _a.functionType = 'SomePred',
4630
4727
  _a.params = params,
4728
+ _a.paramCount = 1,
4631
4729
  _a;
4632
4730
  },
4633
4731
  paramCount: { min: 1 },
@@ -4636,12 +4734,14 @@ var functionalNormalExpression = {
4636
4734
  evaluate: function (_a, sourceCodeInfo) {
4637
4735
  var _b;
4638
4736
  var _c = __read(_a), fn = _c[0], params = _c.slice(1);
4737
+ var fun = asFunctionLike(fn, sourceCodeInfo);
4639
4738
  return _b = {},
4640
4739
  _b[FUNCTION_SYMBOL] = true,
4641
4740
  _b.sourceCodeInfo = sourceCodeInfo,
4642
4741
  _b.functionType = 'Fnull',
4643
- _b.function = asFunctionLike(fn, sourceCodeInfo),
4742
+ _b.function = fun,
4644
4743
  _b.params = params,
4744
+ _b.paramCount = getParamCount(fun),
4645
4745
  _b;
4646
4746
  },
4647
4747
  paramCount: { min: 2 },
@@ -11716,12 +11816,16 @@ var functionSpecialExpression = {
11716
11816
  assertUserDefinedSymbolNode(functionSymbol, node[2]);
11717
11817
  assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
11718
11818
  var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
11819
+ var min = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
11820
+ var max = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; }) ? undefined : evaluatedFunction[0].length;
11821
+ var paramCount = min === max ? min : { min: min, max: max };
11719
11822
  var litsFunction = (_b = {},
11720
11823
  _b[FUNCTION_SYMBOL] = true,
11721
11824
  _b.sourceCodeInfo = node[2],
11722
11825
  _b.functionType = 'UserDefined',
11723
11826
  _b.name = functionSymbol[1],
11724
11827
  _b.evaluatedfunction = evaluatedFunction,
11828
+ _b.paramCount = paramCount,
11725
11829
  _b);
11726
11830
  contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c), functionSymbol[2]);
11727
11831
  return litsFunction;
@@ -11743,13 +11847,17 @@ var defnSpecialExpression = {
11743
11847
  var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
11744
11848
  assertUserDefinedSymbolNode(functionSymbol, node[2]);
11745
11849
  assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
11746
- var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
11850
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
11851
+ var min = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
11852
+ var max = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; }) ? undefined : evaluatedFunction[0].length;
11853
+ var paramCount = min === max ? min : { min: min, max: max };
11747
11854
  var litsFunction = (_b = {},
11748
11855
  _b[FUNCTION_SYMBOL] = true,
11749
11856
  _b.sourceCodeInfo = node[2],
11750
11857
  _b.functionType = 'UserDefined',
11751
11858
  _b.name = functionSymbol[1],
11752
- _b.evaluatedfunction = evaluatedFunctionOverloades,
11859
+ _b.evaluatedfunction = evaluatedFunction,
11860
+ _b.paramCount = paramCount,
11753
11861
  _b);
11754
11862
  contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c), functionSymbol[2]);
11755
11863
  return litsFunction;
@@ -11771,12 +11879,16 @@ var fnSpecialExpression = {
11771
11879
  var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
11772
11880
  var fn = node[1][1];
11773
11881
  var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
11882
+ var min = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
11883
+ var max = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; }) ? undefined : evaluatedFunction[0].length;
11884
+ var paramCount = min === max ? min : { min: min, max: max };
11774
11885
  var litsFunction = (_b = {},
11775
11886
  _b[FUNCTION_SYMBOL] = true,
11776
11887
  _b.sourceCodeInfo = node[2],
11777
11888
  _b.functionType = 'UserDefined',
11778
11889
  _b.name = undefined,
11779
11890
  _b.evaluatedfunction = evaluatedFunction,
11891
+ _b.paramCount = paramCount,
11780
11892
  _b);
11781
11893
  return litsFunction;
11782
11894
  },
@@ -12392,12 +12504,6 @@ new Set(specialExpressionKeys);
12392
12504
  // TODO, remove
12393
12505
  // console.log('builtin', [...specialExpressionKeys, ...normalExpressionKeys].length)
12394
12506
 
12395
- function checkParams(evaluatedFunction, nbrOfParams, sourceCodeInfo) {
12396
- var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
12397
- if (nbrOfParams < minArity) {
12398
- throw new LitsError("Unexpected number of arguments. Expected at least ".concat(minArity, ", got ").concat(nbrOfParams, "."), sourceCodeInfo);
12399
- }
12400
- }
12401
12507
  var functionExecutors = {
12402
12508
  NativeJsFunction: function (fn, params, sourceCodeInfo) {
12403
12509
  var _a;
@@ -12417,7 +12523,10 @@ var functionExecutors = {
12417
12523
  var evaluateNode = _a.evaluateNode;
12418
12524
  var _loop_1 = function () {
12419
12525
  var e_1, _b;
12420
- checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
12526
+ if (!paramCountAcceptsMin(fn.paramCount, params.length)) {
12527
+ throw new LitsError("Expected ".concat(fn.paramCount, " arguments, got ").concat(params.length, "."), sourceCodeInfo);
12528
+ }
12529
+ // checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo)
12421
12530
  var evaluatedFunction = fn.evaluatedfunction;
12422
12531
  var args = evaluatedFunction[0];
12423
12532
  var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
@@ -12714,6 +12823,7 @@ function evaluateNormalExpression(node, contextStack) {
12714
12823
  _a.params = params,
12715
12824
  _a.placeholders = placeholders,
12716
12825
  _a.sourceCodeInfo = sourceCodeInfo,
12826
+ _a.paramCount = paramCountMinus(getParamCount(fn), params.length),
12717
12827
  _a);
12718
12828
  return partialFunction;
12719
12829
  }
@@ -12736,11 +12846,12 @@ function evaluateNormalExpression(node, contextStack) {
12736
12846
  if (placeholders.length > 0) {
12737
12847
  var partialFunction = (_b = {},
12738
12848
  _b[FUNCTION_SYMBOL] = true,
12739
- _b.function = asFunctionLike(fn, sourceCodeInfo),
12849
+ _b.function = fn,
12740
12850
  _b.functionType = 'Partial',
12741
12851
  _b.params = params,
12742
12852
  _b.placeholders = placeholders,
12743
12853
  _b.sourceCodeInfo = sourceCodeInfo,
12854
+ _b.paramCount = paramCountMinus(getParamCount(fn), params.length),
12744
12855
  _b);
12745
12856
  return partialFunction;
12746
12857
  }
@@ -12962,11 +13073,13 @@ var ContextStackImpl = /** @class */ (function () {
12962
13073
  }
12963
13074
  if (isNormalBuiltinSymbolNode(node)) {
12964
13075
  var type = node[1];
13076
+ var normalExpression = allNormalExpressions[type];
12965
13077
  return _b = {},
12966
13078
  _b[FUNCTION_SYMBOL] = true,
12967
13079
  _b.functionType = 'Builtin',
12968
13080
  _b.normalBuitinSymbolType = type,
12969
13081
  _b.sourceCodeInfo = node[2],
13082
+ _b.paramCount = normalExpression.paramCount,
12970
13083
  _b;
12971
13084
  }
12972
13085
  var lookUpResult = this.lookUp(node);
@@ -13003,6 +13116,7 @@ function createContextStack(params) {
13003
13116
  name: name
13004
13117
  },
13005
13118
  _b[FUNCTION_SYMBOL] = true,
13119
+ _b.paramCount = {},
13006
13120
  _b);
13007
13121
  return acc;
13008
13122
  }, {}),