necessary 17.1.8 → 17.1.11

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/README.md CHANGED
@@ -1091,19 +1091,19 @@ Its return value is the difference between the code points of the first differin
1091
1091
  Some examples should clarify:
1092
1092
 
1093
1093
  ```
1094
- strcmp("", "") = 0;
1094
+ strcmp("", "") === 0;
1095
1095
 
1096
- strcmp("a", "") < 0;
1096
+ strcmp("a", "") > 0;
1097
1097
 
1098
- strcmp("", "a") > 0;
1098
+ strcmp("", "a") < 0;
1099
1099
 
1100
- strcmp("a", "a") = 0;
1100
+ strcmp("a", "a") === 0;
1101
1101
 
1102
- strcmp("ab", "a") < 0;
1102
+ strcmp("ab", "a") > 0;
1103
1103
 
1104
- strcmp("ab", "ac") > 0;
1104
+ strcmp("ab", "ac") < 0;
1105
1105
 
1106
- strcmp("C", "𝔸") > 0;
1106
+ strcmp("C", "𝔸") < 0;
1107
1107
  ```
1108
1108
 
1109
1109
  Note that, conceptually speaking, the first argument is taken away from the second argument in order to compute the difference and not the other way around.
@@ -25,76 +25,67 @@ _export(exports, {
25
25
  return substring;
26
26
  }
27
27
  });
28
- const _constants = require("../constants");
29
28
  function strlen(string) {
30
29
  let length = 0;
31
- const iterator = string[Symbol.iterator]();
32
- let character = iterator.next();
33
- while(!character.done){
34
- character = iterator.next();
30
+ for (const _ of string){
35
31
  length++;
36
32
  }
37
33
  return length;
38
34
  }
39
35
  function strcmp(stringA, stringB) {
40
- let difference;
41
- const iteratorA = stringA[Symbol.iterator](), iteratorB = stringB[Symbol.iterator](); ///
42
- let characterA = iteratorA.next(), characterB = iteratorB.next(), codePointA, codePointB;
43
- while(true){
44
- codePointA = characterA.value ? characterA.value.codePointAt(0) : 0;
45
- codePointB = characterB.value ? characterB.value.codePointAt(0) : 0;
46
- difference = codePointB - codePointA;
36
+ let difference = 0;
37
+ let naiveIndexA = 0, naiveIndexB = 0;
38
+ const stringANaiveLength = stringA.length, stringBNaiveLength = stringB.length;
39
+ while(naiveIndexA < stringANaiveLength || naiveIndexB < stringBNaiveLength){
40
+ const codePointA = naiveIndexA < stringANaiveLength ? stringA.codePointAt(naiveIndexA) : 0, codePointB = naiveIndexB < stringBNaiveLength ? stringB.codePointAt(naiveIndexB) : 0;
41
+ difference = codePointA - codePointB;
47
42
  if (difference !== 0) {
48
43
  break;
49
44
  }
50
- if (characterA.done || characterB.done) {
51
- break;
52
- }
53
- characterA = iteratorA.next();
54
- characterB = iteratorB.next();
45
+ naiveIndexA += codePointA > 0xFFFF ? 2 : 1;
46
+ naiveIndexB += codePointB > 0xFFFF ? 2 : 1;
55
47
  }
56
48
  return difference;
57
49
  }
58
50
  function indexOf(string, searchString) {
59
- let index = -1, found = false;
60
- const searchStringLength = strlen(searchString);
51
+ let index = -1;
52
+ const searchStringLength = searchString.length;
61
53
  if (searchStringLength > 0) {
62
- let character;
63
- const iterator = string[Symbol.iterator](), searchIterator = searchString[Symbol.iterator](), searchCharacter = searchIterator.next();
64
- character = iterator.next();
65
- index++;
66
- while(!character.done){
67
- if (character.value === searchCharacter.value) {
68
- const start = index, end = start + searchStringLength, subString = substring(string, start, end), difference = strcmp(subString, searchString);
69
- if (difference === 0) {
70
- found = true;
71
- break;
72
- }
54
+ const outerNaiveIndex = string.indexOf(searchString);
55
+ if (outerNaiveIndex > -1) {
56
+ index = 0;
57
+ let innerNaiveIndex = 0;
58
+ while(innerNaiveIndex < outerNaiveIndex){
59
+ const charCode = string.charCodeAt(innerNaiveIndex);
60
+ innerNaiveIndex += charCode >= 0xD800 && charCode <= 0xDBFF ? 2 : 1;
61
+ index++;
73
62
  }
74
- character = iterator.next();
75
- index++;
76
63
  }
77
64
  }
78
- if (!found) {
79
- index = -1;
80
- }
81
65
  return index;
82
66
  }
83
67
  function substring(string, start, end = Infinity) {
84
- let index = 0;
85
- const iterator = string[Symbol.iterator](), characters = [];
86
- let character = iterator.next();
87
- while(!character.done){
68
+ const stringNaiveLength = string.length;
69
+ let index = 0, naiveIndex = 0, naiveStart = stringNaiveLength, naiveEnd = stringNaiveLength; ///
70
+ while(naiveIndex < stringNaiveLength){
71
+ if (index === start) {
72
+ naiveStart = naiveIndex; ///
73
+ }
88
74
  if (index === end) {
75
+ naiveEnd = naiveIndex; ///
89
76
  break;
90
77
  }
91
- if (index >= start) {
92
- characters.push(character.value); ///
93
- }
78
+ const charCode = string.charCodeAt(naiveIndex);
79
+ naiveIndex += charCode >= 0xD800 && charCode <= 0xDBFF ? 2 : 1;
94
80
  index++;
95
- character = iterator.next();
96
81
  }
97
- const substring1 = characters.join(_constants.EMPTY_STRING);
82
+ if (index === start) {
83
+ naiveStart = naiveIndex; ///
84
+ }
85
+ if (index === end) {
86
+ naiveEnd = naiveIndex; ///
87
+ }
88
+ const substring1 = string.substring(naiveStart, naiveEnd);
98
89
  return substring1;
99
90
  }
100
91
  const _default = {
@@ -104,4 +95,4 @@ const _default = {
104
95
  substring
105
96
  };
106
97
 
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvc3RyaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBFTVBUWV9TVFJJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJsZW4oc3RyaW5nKSB7XG4gIGxldCBsZW5ndGggPSAwO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gc3RyaW5nW1N5bWJvbC5pdGVyYXRvcl0oKTtcblxuICBsZXQgY2hhcmFjdGVyID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gIHdoaWxlICghY2hhcmFjdGVyLmRvbmUpIHtcbiAgICBjaGFyYWN0ZXIgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICBsZW5ndGgrK1xuICB9XG5cbiAgcmV0dXJuIGxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmNtcChzdHJpbmdBLCBzdHJpbmdCKSB7XG4gIGxldCBkaWZmZXJlbmNlO1xuXG4gIGNvbnN0IGl0ZXJhdG9yQSA9IHN0cmluZ0FbU3ltYm9sLml0ZXJhdG9yXSgpLCAvLy9cbiAgICAgICAgaXRlcmF0b3JCID0gc3RyaW5nQltTeW1ib2wuaXRlcmF0b3JdKCk7IC8vL1xuXG4gIGxldCBjaGFyYWN0ZXJBID0gaXRlcmF0b3JBLm5leHQoKSxcbiAgICAgIGNoYXJhY3RlckIgPSBpdGVyYXRvckIubmV4dCgpLFxuICAgICAgY29kZVBvaW50QSxcbiAgICAgIGNvZGVQb2ludEI7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb2RlUG9pbnRBID0gY2hhcmFjdGVyQS52YWx1ZSA/IC8vL1xuICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckEudmFsdWUuY29kZVBvaW50QXQoMCkgOlxuICAgICAgICAgICAgICAgICAgICAgMDtcbiAgICBjb2RlUG9pbnRCID0gY2hhcmFjdGVyQi52YWx1ZSA/IC8vL1xuICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckIudmFsdWUuY29kZVBvaW50QXQoMCkgOlxuICAgICAgICAgICAgICAgICAgICAgMDtcblxuICAgIGRpZmZlcmVuY2UgPSBjb2RlUG9pbnRCIC0gY29kZVBvaW50QTtcblxuICAgIGlmIChkaWZmZXJlbmNlICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY2hhcmFjdGVyQS5kb25lIHx8IGNoYXJhY3RlckIuZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyQSA9IGl0ZXJhdG9yQS5uZXh0KCk7XG4gICAgY2hhcmFjdGVyQiA9IGl0ZXJhdG9yQi5uZXh0KCk7XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZGV4T2Yoc3RyaW5nLCBzZWFyY2hTdHJpbmcpIHtcbiAgbGV0IGluZGV4ID0gLTEsXG4gICAgICBmb3VuZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHN0cmxlbihzZWFyY2hTdHJpbmcpO1xuXG4gIGlmIChzZWFyY2hTdHJpbmdMZW5ndGggPiAwKSB7XG4gICAgbGV0IGNoYXJhY3RlcjtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gc3RyaW5nW1N5bWJvbC5pdGVyYXRvcl0oKSxcbiAgICAgICAgICBzZWFyY2hJdGVyYXRvciA9IHNlYXJjaFN0cmluZ1tTeW1ib2wuaXRlcmF0b3JdKCksXG4gICAgICAgICAgc2VhcmNoQ2hhcmFjdGVyID0gc2VhcmNoSXRlcmF0b3IubmV4dCgpO1xuXG4gICAgY2hhcmFjdGVyID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgaW5kZXgrKztcblxuICAgIHdoaWxlICghY2hhcmFjdGVyLmRvbmUpIHtcbiAgICAgIGlmIChjaGFyYWN0ZXIudmFsdWUgPT09IHNlYXJjaENoYXJhY3Rlci52YWx1ZSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgc2VhcmNoU3RyaW5nTGVuZ3RoLFxuICAgICAgICAgICAgICBzdWJTdHJpbmcgPSBzdWJzdHJpbmcoc3RyaW5nLCBzdGFydCwgZW5kKSxcbiAgICAgICAgICAgICAgZGlmZmVyZW5jZSA9IHN0cmNtcChzdWJTdHJpbmcsIHNlYXJjaFN0cmluZyk7XG5cbiAgICAgICAgaWYgKGRpZmZlcmVuY2UgPT09IDApIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjaGFyYWN0ZXIgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGluZGV4KytcbiAgICB9XG4gIH1cblxuICBpZiAoIWZvdW5kKSB7XG4gICAgaW5kZXggPSAtMTtcbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0cmluZyhzdHJpbmcsIHN0YXJ0LCBlbmQgPSBJbmZpbml0eSkge1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gc3RyaW5nW1N5bWJvbC5pdGVyYXRvcl0oKSxcbiAgICAgICAgY2hhcmFjdGVycyA9IFtdO1xuXG4gIGxldCBjaGFyYWN0ZXIgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgd2hpbGUgKCFjaGFyYWN0ZXIuZG9uZSkge1xuICAgIGlmIChpbmRleCA9PT0gZW5kKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPj0gc3RhcnQpIHtcbiAgICAgIGNoYXJhY3RlcnMucHVzaChjaGFyYWN0ZXIudmFsdWUpOyAvLy9cbiAgICB9XG5cbiAgICBpbmRleCsrXG5cbiAgICBjaGFyYWN0ZXIgPSBpdGVyYXRvci5uZXh0KCk7XG4gIH1cblxuICBjb25zdCBzdWJzdHJpbmcgPSBjaGFyYWN0ZXJzLmpvaW4oRU1QVFlfU1RSSU5HKTtcblxuICByZXR1cm4gc3Vic3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN0cmNtcCxcbiAgc3RybGVuLFxuICBpbmRleE9mLFxuICBzdWJzdHJpbmdcbn07XG4iXSwibmFtZXMiOlsiaW5kZXhPZiIsInN0cmNtcCIsInN0cmxlbiIsInN1YnN0cmluZyIsInN0cmluZyIsImxlbmd0aCIsIml0ZXJhdG9yIiwiU3ltYm9sIiwiY2hhcmFjdGVyIiwibmV4dCIsImRvbmUiLCJzdHJpbmdBIiwic3RyaW5nQiIsImRpZmZlcmVuY2UiLCJpdGVyYXRvckEiLCJpdGVyYXRvckIiLCJjaGFyYWN0ZXJBIiwiY2hhcmFjdGVyQiIsImNvZGVQb2ludEEiLCJjb2RlUG9pbnRCIiwidmFsdWUiLCJjb2RlUG9pbnRBdCIsInNlYXJjaFN0cmluZyIsImluZGV4IiwiZm91bmQiLCJzZWFyY2hTdHJpbmdMZW5ndGgiLCJzZWFyY2hJdGVyYXRvciIsInNlYXJjaENoYXJhY3RlciIsInN0YXJ0IiwiZW5kIiwic3ViU3RyaW5nIiwiSW5maW5pdHkiLCJjaGFyYWN0ZXJzIiwicHVzaCIsImpvaW4iLCJFTVBUWV9TVFJJTkciXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQStIQTtlQUFBOztRQXZFZ0JBO2VBQUFBOztRQXBDQUM7ZUFBQUE7O1FBaEJBQztlQUFBQTs7UUFnR0FDO2VBQUFBOzs7MkJBbEdhO0FBRXRCLFNBQVNELE9BQU9FLE1BQU07SUFDM0IsSUFBSUMsU0FBUztJQUViLE1BQU1DLFdBQVdGLE1BQU0sQ0FBQ0csT0FBT0QsUUFBUSxDQUFDO0lBRXhDLElBQUlFLFlBQVlGLFNBQVNHLElBQUk7SUFFN0IsTUFBTyxDQUFDRCxVQUFVRSxJQUFJLENBQUU7UUFDdEJGLFlBQVlGLFNBQVNHLElBQUk7UUFFekJKO0lBQ0Y7SUFFQSxPQUFPQTtBQUNUO0FBRU8sU0FBU0osT0FBT1UsT0FBTyxFQUFFQyxPQUFPO0lBQ3JDLElBQUlDO0lBRUosTUFBTUMsWUFBWUgsT0FBTyxDQUFDSixPQUFPRCxRQUFRLENBQUMsSUFDcENTLFlBQVlILE9BQU8sQ0FBQ0wsT0FBT0QsUUFBUSxDQUFDLElBQUksR0FBRztJQUVqRCxJQUFJVSxhQUFhRixVQUFVTCxJQUFJLElBQzNCUSxhQUFhRixVQUFVTixJQUFJLElBQzNCUyxZQUNBQztJQUVKLE1BQU8sS0FBTTtRQUNYRCxhQUFhRixXQUFXSSxLQUFLLEdBQ2RKLFdBQVdJLEtBQUssQ0FBQ0MsV0FBVyxDQUFDLEtBQzNCO1FBQ2pCRixhQUFhRixXQUFXRyxLQUFLLEdBQ2RILFdBQVdHLEtBQUssQ0FBQ0MsV0FBVyxDQUFDLEtBQzNCO1FBRWpCUixhQUFhTSxhQUFhRDtRQUUxQixJQUFJTCxlQUFlLEdBQUc7WUFDcEI7UUFDRjtRQUVBLElBQUlHLFdBQVdOLElBQUksSUFBSU8sV0FBV1AsSUFBSSxFQUFFO1lBQ3RDO1FBQ0Y7UUFFQU0sYUFBYUYsVUFBVUwsSUFBSTtRQUMzQlEsYUFBYUYsVUFBVU4sSUFBSTtJQUM3QjtJQUVBLE9BQU9JO0FBQ1Q7QUFFTyxTQUFTYixRQUFRSSxNQUFNLEVBQUVrQixZQUFZO0lBQzFDLElBQUlDLFFBQVEsQ0FBQyxHQUNUQyxRQUFRO0lBRVosTUFBTUMscUJBQXFCdkIsT0FBT29CO0lBRWxDLElBQUlHLHFCQUFxQixHQUFHO1FBQzFCLElBQUlqQjtRQUVKLE1BQU1GLFdBQVdGLE1BQU0sQ0FBQ0csT0FBT0QsUUFBUSxDQUFDLElBQ2xDb0IsaUJBQWlCSixZQUFZLENBQUNmLE9BQU9ELFFBQVEsQ0FBQyxJQUM5Q3FCLGtCQUFrQkQsZUFBZWpCLElBQUk7UUFFM0NELFlBQVlGLFNBQVNHLElBQUk7UUFFekJjO1FBRUEsTUFBTyxDQUFDZixVQUFVRSxJQUFJLENBQUU7WUFDdEIsSUFBSUYsVUFBVVksS0FBSyxLQUFLTyxnQkFBZ0JQLEtBQUssRUFBRTtnQkFDN0MsTUFBTVEsUUFBUUwsT0FDUk0sTUFBTUQsUUFBUUgsb0JBQ2RLLFlBQVkzQixVQUFVQyxRQUFRd0IsT0FBT0MsTUFDckNoQixhQUFhWixPQUFPNkIsV0FBV1I7Z0JBRXJDLElBQUlULGVBQWUsR0FBRztvQkFDcEJXLFFBQVE7b0JBRVI7Z0JBQ0Y7WUFDRjtZQUVBaEIsWUFBWUYsU0FBU0csSUFBSTtZQUV6QmM7UUFDRjtJQUNGO0lBRUEsSUFBSSxDQUFDQyxPQUFPO1FBQ1ZELFFBQVEsQ0FBQztJQUNYO0lBRUEsT0FBT0E7QUFDVDtBQUVPLFNBQVNwQixVQUFVQyxNQUFNLEVBQUV3QixLQUFLLEVBQUVDLE1BQU1FLFFBQVE7SUFDckQsSUFBSVIsUUFBUTtJQUVaLE1BQU1qQixXQUFXRixNQUFNLENBQUNHLE9BQU9ELFFBQVEsQ0FBQyxJQUNsQzBCLGFBQWEsRUFBRTtJQUVyQixJQUFJeEIsWUFBWUYsU0FBU0csSUFBSTtJQUU3QixNQUFPLENBQUNELFVBQVVFLElBQUksQ0FBRTtRQUN0QixJQUFJYSxVQUFVTSxLQUFLO1lBQ2pCO1FBQ0Y7UUFFQSxJQUFJTixTQUFTSyxPQUFPO1lBQ2xCSSxXQUFXQyxJQUFJLENBQUN6QixVQUFVWSxLQUFLLEdBQUcsR0FBRztRQUN2QztRQUVBRztRQUVBZixZQUFZRixTQUFTRyxJQUFJO0lBQzNCO0lBRUEsTUFBTU4sYUFBWTZCLFdBQVdFLElBQUksQ0FBQ0MsdUJBQVk7SUFFOUMsT0FBT2hDO0FBQ1Q7TUFFQSxXQUFlO0lBQ2JGO0lBQ0FDO0lBQ0FGO0lBQ0FHO0FBQ0YifQ==
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvc3RyaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RybGVuKHN0cmluZykge1xuICBsZXQgbGVuZ3RoID0gMDtcblxuICBmb3IgKGNvbnN0IF8gb2Ygc3RyaW5nKSB7XG4gICAgbGVuZ3RoKys7XG4gIH1cblxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyY21wKHN0cmluZ0EsIHN0cmluZ0IpIHtcbiAgbGV0IGRpZmZlcmVuY2UgPSAwO1xuXG4gIGxldCBuYWl2ZUluZGV4QSA9IDAsXG4gICAgICBuYWl2ZUluZGV4QiA9IDA7XG5cbiAgY29uc3Qgc3RyaW5nQU5haXZlTGVuZ3RoID0gc3RyaW5nQS5sZW5ndGgsXG4gICAgICAgIHN0cmluZ0JOYWl2ZUxlbmd0aCA9IHN0cmluZ0IubGVuZ3RoO1xuXG4gIHdoaWxlICgobmFpdmVJbmRleEEgPCBzdHJpbmdBTmFpdmVMZW5ndGgpIHx8IChuYWl2ZUluZGV4QiA8IHN0cmluZ0JOYWl2ZUxlbmd0aCkpIHtcbiAgICBjb25zdCBjb2RlUG9pbnRBID0gKG5haXZlSW5kZXhBIDwgc3RyaW5nQU5haXZlTGVuZ3RoKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQS5jb2RlUG9pbnRBdChuYWl2ZUluZGV4QSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICBjb2RlUG9pbnRCID0gKG5haXZlSW5kZXhCIDwgc3RyaW5nQk5haXZlTGVuZ3RoKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQi5jb2RlUG9pbnRBdChuYWl2ZUluZGV4QikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgMDtcblxuICAgIGRpZmZlcmVuY2UgPSAoY29kZVBvaW50QSAtIGNvZGVQb2ludEIpO1xuXG4gICAgaWYgKGRpZmZlcmVuY2UgIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5haXZlSW5kZXhBICs9IChjb2RlUG9pbnRBID4gMHhGRkZGKSA/XG4gICAgICAgICAgICAgICAgMiA6XG4gICAgICAgICAgICAgICAgICAxO1xuXG4gICAgbmFpdmVJbmRleEIgKz0gKGNvZGVQb2ludEIgPiAweEZGRkYpID9cbiAgICAgICAgICAgICAgICAyIDpcbiAgICAgICAgICAgICAgICAgIDE7XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZGV4T2Yoc3RyaW5nLCBzZWFyY2hTdHJpbmcpIHtcbiAgbGV0IGluZGV4ID0gLTE7XG5cbiAgY29uc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aDtcblxuICBpZiAoc2VhcmNoU3RyaW5nTGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG91dGVyTmFpdmVJbmRleCA9IHN0cmluZy5pbmRleE9mKHNlYXJjaFN0cmluZyk7XG5cbiAgICBpZiAob3V0ZXJOYWl2ZUluZGV4ID4gLTEpIHtcbiAgICAgIGluZGV4ID0gMDtcblxuICAgICAgbGV0IGlubmVyTmFpdmVJbmRleCA9IDA7XG5cbiAgICAgIHdoaWxlIChpbm5lck5haXZlSW5kZXggPCBvdXRlck5haXZlSW5kZXgpIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpbm5lck5haXZlSW5kZXgpO1xuXG4gICAgICAgIGlubmVyTmFpdmVJbmRleCArPSAoKGNoYXJDb2RlID49IDB4RDgwMCkgJiYgKGNoYXJDb2RlIDw9IDB4REJGRikpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTtcblxuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0cmluZyhzdHJpbmcsIHN0YXJ0LCBlbmQgPSBJbmZpbml0eSkge1xuICBjb25zdCBzdHJpbmdOYWl2ZUxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgbGV0IGluZGV4ID0gMCxcbiAgICAgIG5haXZlSW5kZXggPSAwLFxuICAgICAgbmFpdmVTdGFydCA9IHN0cmluZ05haXZlTGVuZ3RoLCAvLy9cbiAgICAgIG5haXZlRW5kID0gc3RyaW5nTmFpdmVMZW5ndGg7IC8vL1xuXG4gIHdoaWxlIChuYWl2ZUluZGV4IDwgc3RyaW5nTmFpdmVMZW5ndGgpIHtcbiAgICBpZiAoaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICBuYWl2ZVN0YXJ0ID0gbmFpdmVJbmRleDsgIC8vL1xuICAgIH1cblxuICAgIGlmIChpbmRleCA9PT0gZW5kKSB7XG4gICAgICBuYWl2ZUVuZCA9IG5haXZlSW5kZXg7ICAvLy9cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhckNvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChuYWl2ZUluZGV4KTtcblxuICAgIG5haXZlSW5kZXggKz0gKChjaGFyQ29kZSA+PSAweEQ4MDApICYmIChjaGFyQ29kZSA8PSAweERCRkYpKSA/XG4gICAgICAgICAgICAgICAgICAgIDIgOlxuICAgICAgICAgICAgICAgICAgICAgIDE7XG5cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKGluZGV4ID09PSBzdGFydCkge1xuICAgIG5haXZlU3RhcnQgPSBuYWl2ZUluZGV4OyAgLy8vXG4gIH1cblxuICBpZiAoaW5kZXggPT09IGVuZCkge1xuICAgIG5haXZlRW5kID0gbmFpdmVJbmRleDsgIC8vL1xuICB9XG5cbiAgY29uc3Qgc3Vic3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhuYWl2ZVN0YXJ0LCBuYWl2ZUVuZCk7XG5cbiAgcmV0dXJuIHN1YnN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBzdHJjbXAsXG4gIHN0cmxlbixcbiAgaW5kZXhPZixcbiAgc3Vic3RyaW5nXG59O1xuIl0sIm5hbWVzIjpbImluZGV4T2YiLCJzdHJjbXAiLCJzdHJsZW4iLCJzdWJzdHJpbmciLCJzdHJpbmciLCJsZW5ndGgiLCJfIiwic3RyaW5nQSIsInN0cmluZ0IiLCJkaWZmZXJlbmNlIiwibmFpdmVJbmRleEEiLCJuYWl2ZUluZGV4QiIsInN0cmluZ0FOYWl2ZUxlbmd0aCIsInN0cmluZ0JOYWl2ZUxlbmd0aCIsImNvZGVQb2ludEEiLCJjb2RlUG9pbnRBdCIsImNvZGVQb2ludEIiLCJzZWFyY2hTdHJpbmciLCJpbmRleCIsInNlYXJjaFN0cmluZ0xlbmd0aCIsIm91dGVyTmFpdmVJbmRleCIsImlubmVyTmFpdmVJbmRleCIsImNoYXJDb2RlIiwiY2hhckNvZGVBdCIsInN0YXJ0IiwiZW5kIiwiSW5maW5pdHkiLCJzdHJpbmdOYWl2ZUxlbmd0aCIsIm5haXZlSW5kZXgiLCJuYWl2ZVN0YXJ0IiwibmFpdmVFbmQiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQW9IQTtlQUFBOztRQXJFZ0JBO2VBQUFBOztRQW5DQUM7ZUFBQUE7O1FBVkFDO2VBQUFBOztRQXlFQUM7ZUFBQUE7OztBQXpFVCxTQUFTRCxPQUFPRSxNQUFNO0lBQzNCLElBQUlDLFNBQVM7SUFFYixLQUFLLE1BQU1DLEtBQUtGLE9BQVE7UUFDdEJDO0lBQ0Y7SUFFQSxPQUFPQTtBQUNUO0FBRU8sU0FBU0osT0FBT00sT0FBTyxFQUFFQyxPQUFPO0lBQ3JDLElBQUlDLGFBQWE7SUFFakIsSUFBSUMsY0FBYyxHQUNkQyxjQUFjO0lBRWxCLE1BQU1DLHFCQUFxQkwsUUFBUUYsTUFBTSxFQUNuQ1EscUJBQXFCTCxRQUFRSCxNQUFNO0lBRXpDLE1BQU8sQUFBQ0ssY0FBY0Usc0JBQXdCRCxjQUFjRSxtQkFBcUI7UUFDL0UsTUFBTUMsYUFBYSxBQUFDSixjQUFjRSxxQkFDYkwsUUFBUVEsV0FBVyxDQUFDTCxlQUNsQixHQUNqQk0sYUFBYSxBQUFDTCxjQUFjRSxxQkFDYkwsUUFBUU8sV0FBVyxDQUFDSixlQUNsQjtRQUV2QkYsYUFBY0ssYUFBYUU7UUFFM0IsSUFBSVAsZUFBZSxHQUFHO1lBQ3BCO1FBQ0Y7UUFFQUMsZUFBZSxBQUFDSSxhQUFhLFNBQ2pCLElBQ0U7UUFFZEgsZUFBZSxBQUFDSyxhQUFhLFNBQ2pCLElBQ0U7SUFDaEI7SUFFQSxPQUFPUDtBQUNUO0FBRU8sU0FBU1QsUUFBUUksTUFBTSxFQUFFYSxZQUFZO0lBQzFDLElBQUlDLFFBQVEsQ0FBQztJQUViLE1BQU1DLHFCQUFxQkYsYUFBYVosTUFBTTtJQUU5QyxJQUFJYyxxQkFBcUIsR0FBRztRQUMxQixNQUFNQyxrQkFBa0JoQixPQUFPSixPQUFPLENBQUNpQjtRQUV2QyxJQUFJRyxrQkFBa0IsQ0FBQyxHQUFHO1lBQ3hCRixRQUFRO1lBRVIsSUFBSUcsa0JBQWtCO1lBRXRCLE1BQU9BLGtCQUFrQkQsZ0JBQWlCO2dCQUN4QyxNQUFNRSxXQUFXbEIsT0FBT21CLFVBQVUsQ0FBQ0Y7Z0JBRW5DQSxtQkFBbUIsQUFBQyxBQUFDQyxZQUFZLFVBQVlBLFlBQVksU0FDcEMsSUFDRTtnQkFFdkJKO1lBQ0Y7UUFDRjtJQUNGO0lBRUEsT0FBT0E7QUFDVDtBQUVPLFNBQVNmLFVBQVVDLE1BQU0sRUFBRW9CLEtBQUssRUFBRUMsTUFBTUMsUUFBUTtJQUNyRCxNQUFNQyxvQkFBb0J2QixPQUFPQyxNQUFNO0lBRXZDLElBQUlhLFFBQVEsR0FDUlUsYUFBYSxHQUNiQyxhQUFhRixtQkFDYkcsV0FBV0gsbUJBQW1CLEdBQUc7SUFFckMsTUFBT0MsYUFBYUQsa0JBQW1CO1FBQ3JDLElBQUlULFVBQVVNLE9BQU87WUFDbkJLLGFBQWFELFlBQWEsR0FBRztRQUMvQjtRQUVBLElBQUlWLFVBQVVPLEtBQUs7WUFDakJLLFdBQVdGLFlBQWEsR0FBRztZQUUzQjtRQUNGO1FBRUEsTUFBTU4sV0FBV2xCLE9BQU9tQixVQUFVLENBQUNLO1FBRW5DQSxjQUFjLEFBQUMsQUFBQ04sWUFBWSxVQUFZQSxZQUFZLFNBQ3BDLElBQ0U7UUFFbEJKO0lBQ0Y7SUFFQSxJQUFJQSxVQUFVTSxPQUFPO1FBQ25CSyxhQUFhRCxZQUFhLEdBQUc7SUFDL0I7SUFFQSxJQUFJVixVQUFVTyxLQUFLO1FBQ2pCSyxXQUFXRixZQUFhLEdBQUc7SUFDN0I7SUFFQSxNQUFNekIsYUFBWUMsT0FBT0QsU0FBUyxDQUFDMEIsWUFBWUM7SUFFL0MsT0FBTzNCO0FBQ1Q7TUFFQSxXQUFlO0lBQ2JGO0lBQ0FDO0lBQ0FGO0lBQ0FHO0FBQ0YifQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "necessary",
3
3
  "author": "James Smith",
4
- "version": "17.1.8",
4
+ "version": "17.1.11",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/necessary",
7
7
  "description": "A collection of utility functions.",
@@ -12,7 +12,7 @@
12
12
  "devDependencies": {
13
13
  "@swc/core": "1.13.20",
14
14
  "lively-cli": "^2.0.100",
15
- "watchful-cli": "^1.7.86"
15
+ "watchful-cli": "^1.7.89"
16
16
  },
17
17
  "scripts": {
18
18
  "clean": "rm -rf ./lib",
@@ -1,126 +1,115 @@
1
1
  "use strict";
2
2
 
3
- import { EMPTY_STRING } from "../constants";
4
-
5
3
  export function strlen(string) {
6
4
  let length = 0;
7
5
 
8
- const iterator = string[Symbol.iterator]();
9
-
10
- let character = iterator.next();
11
-
12
- while (!character.done) {
13
- character = iterator.next();
14
-
15
- length++
6
+ for (const _ of string) {
7
+ length++;
16
8
  }
17
9
 
18
10
  return length;
19
11
  }
20
12
 
21
13
  export function strcmp(stringA, stringB) {
22
- let difference;
14
+ let difference = 0;
23
15
 
24
- const iteratorA = stringA[Symbol.iterator](), ///
25
- iteratorB = stringB[Symbol.iterator](); ///
16
+ let naiveIndexA = 0,
17
+ naiveIndexB = 0;
26
18
 
27
- let characterA = iteratorA.next(),
28
- characterB = iteratorB.next(),
29
- codePointA,
30
- codePointB;
19
+ const stringANaiveLength = stringA.length,
20
+ stringBNaiveLength = stringB.length;
31
21
 
32
- while (true) {
33
- codePointA = characterA.value ? ///
34
- characterA.value.codePointAt(0) :
35
- 0;
36
- codePointB = characterB.value ? ///
37
- characterB.value.codePointAt(0) :
38
- 0;
22
+ while ((naiveIndexA < stringANaiveLength) || (naiveIndexB < stringBNaiveLength)) {
23
+ const codePointA = (naiveIndexA < stringANaiveLength) ?
24
+ stringA.codePointAt(naiveIndexA) :
25
+ 0,
26
+ codePointB = (naiveIndexB < stringBNaiveLength) ?
27
+ stringB.codePointAt(naiveIndexB) :
28
+ 0;
39
29
 
40
- difference = codePointB - codePointA;
30
+ difference = (codePointA - codePointB);
41
31
 
42
32
  if (difference !== 0) {
43
33
  break;
44
34
  }
45
35
 
46
- if (characterA.done || characterB.done) {
47
- break;
48
- }
36
+ naiveIndexA += (codePointA > 0xFFFF) ?
37
+ 2 :
38
+ 1;
49
39
 
50
- characterA = iteratorA.next();
51
- characterB = iteratorB.next();
40
+ naiveIndexB += (codePointB > 0xFFFF) ?
41
+ 2 :
42
+ 1;
52
43
  }
53
44
 
54
45
  return difference;
55
46
  }
56
47
 
57
48
  export function indexOf(string, searchString) {
58
- let index = -1,
59
- found = false;
49
+ let index = -1;
60
50
 
61
- const searchStringLength = strlen(searchString);
51
+ const searchStringLength = searchString.length;
62
52
 
63
53
  if (searchStringLength > 0) {
64
- let character;
65
-
66
- const iterator = string[Symbol.iterator](),
67
- searchIterator = searchString[Symbol.iterator](),
68
- searchCharacter = searchIterator.next();
54
+ const outerNaiveIndex = string.indexOf(searchString);
69
55
 
70
- character = iterator.next();
56
+ if (outerNaiveIndex > -1) {
57
+ index = 0;
71
58
 
72
- index++;
59
+ let innerNaiveIndex = 0;
73
60
 
74
- while (!character.done) {
75
- if (character.value === searchCharacter.value) {
76
- const start = index, ///
77
- end = start + searchStringLength,
78
- subString = substring(string, start, end),
79
- difference = strcmp(subString, searchString);
61
+ while (innerNaiveIndex < outerNaiveIndex) {
62
+ const charCode = string.charCodeAt(innerNaiveIndex);
80
63
 
81
- if (difference === 0) {
82
- found = true;
64
+ innerNaiveIndex += ((charCode >= 0xD800) && (charCode <= 0xDBFF)) ?
65
+ 2 :
66
+ 1;
83
67
 
84
- break;
85
- }
68
+ index++;
86
69
  }
87
-
88
- character = iterator.next();
89
-
90
- index++
91
70
  }
92
71
  }
93
72
 
94
- if (!found) {
95
- index = -1;
96
- }
97
-
98
73
  return index;
99
74
  }
100
75
 
101
76
  export function substring(string, start, end = Infinity) {
102
- let index = 0;
77
+ const stringNaiveLength = string.length;
103
78
 
104
- const iterator = string[Symbol.iterator](),
105
- characters = [];
79
+ let index = 0,
80
+ naiveIndex = 0,
81
+ naiveStart = stringNaiveLength, ///
82
+ naiveEnd = stringNaiveLength; ///
106
83
 
107
- let character = iterator.next();
84
+ while (naiveIndex < stringNaiveLength) {
85
+ if (index === start) {
86
+ naiveStart = naiveIndex; ///
87
+ }
108
88
 
109
- while (!character.done) {
110
89
  if (index === end) {
90
+ naiveEnd = naiveIndex; ///
91
+
111
92
  break;
112
93
  }
113
94
 
114
- if (index >= start) {
115
- characters.push(character.value); ///
116
- }
95
+ const charCode = string.charCodeAt(naiveIndex);
117
96
 
118
- index++
97
+ naiveIndex += ((charCode >= 0xD800) && (charCode <= 0xDBFF)) ?
98
+ 2 :
99
+ 1;
100
+
101
+ index++;
102
+ }
103
+
104
+ if (index === start) {
105
+ naiveStart = naiveIndex; ///
106
+ }
119
107
 
120
- character = iterator.next();
108
+ if (index === end) {
109
+ naiveEnd = naiveIndex; ///
121
110
  }
122
111
 
123
- const substring = characters.join(EMPTY_STRING);
112
+ const substring = string.substring(naiveStart, naiveEnd);
124
113
 
125
114
  return substring;
126
115
  }