necessary 17.1.7 → 17.1.10

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
@@ -824,7 +824,7 @@ If the array is not long enough they return `undefined`.
824
824
 
825
825
  * The `head()` function returns an array containing the first element of its array argument whilst the `tail()` function returns an array containing all but the first element of its array argument.
826
826
 
827
- * The `back()` function returns an array containing hte last element of its array argument whilst the `front()` function returns an array returning all but the last element of its array argument.
827
+ * The `back()` function returns an array containing the last element of its array argument whilst the `front()` function returns an array returning all but the last element of its array argument.
828
828
 
829
829
  * The `push()` function is similar to its native counterpart but will push an array rather than a single element.
830
830
 
@@ -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.7",
4
+ "version": "17.1.10",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/necessary",
7
7
  "description": "A collection of utility functions.",
@@ -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
  }