necessary 17.1.8 → 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 +7 -7
- package/lib/utilities/string.js +36 -45
- package/package.json +1 -1
- package/src/utilities/string.js +58 -69
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("", "")
|
|
1094
|
+
strcmp("", "") === 0;
|
|
1095
1095
|
|
|
1096
|
-
strcmp("a", "")
|
|
1096
|
+
strcmp("a", "") > 0;
|
|
1097
1097
|
|
|
1098
|
-
strcmp("", "a")
|
|
1098
|
+
strcmp("", "a") < 0;
|
|
1099
1099
|
|
|
1100
|
-
strcmp("a", "a")
|
|
1100
|
+
strcmp("a", "a") === 0;
|
|
1101
1101
|
|
|
1102
|
-
strcmp("ab", "a")
|
|
1102
|
+
strcmp("ab", "a") > 0;
|
|
1103
1103
|
|
|
1104
|
-
strcmp("ab", "ac")
|
|
1104
|
+
strcmp("ab", "ac") < 0;
|
|
1105
1105
|
|
|
1106
|
-
strcmp("C", "𝔸")
|
|
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.
|
package/lib/utilities/string.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
while(
|
|
44
|
-
codePointA =
|
|
45
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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
|
|
60
|
-
const searchStringLength =
|
|
51
|
+
let index = -1;
|
|
52
|
+
const searchStringLength = searchString.length;
|
|
61
53
|
if (searchStringLength > 0) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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
|
-
|
|
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,
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvc3RyaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RybGVuKHN0cmluZykge1xuICBsZXQgbGVuZ3RoID0gMDtcblxuICBmb3IgKGNvbnN0IF8gb2Ygc3RyaW5nKSB7XG4gICAgbGVuZ3RoKys7XG4gIH1cblxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyY21wKHN0cmluZ0EsIHN0cmluZ0IpIHtcbiAgbGV0IGRpZmZlcmVuY2UgPSAwO1xuXG4gIGxldCBuYWl2ZUluZGV4QSA9IDAsXG4gICAgICBuYWl2ZUluZGV4QiA9IDA7XG5cbiAgY29uc3Qgc3RyaW5nQU5haXZlTGVuZ3RoID0gc3RyaW5nQS5sZW5ndGgsXG4gICAgICAgIHN0cmluZ0JOYWl2ZUxlbmd0aCA9IHN0cmluZ0IubGVuZ3RoO1xuXG4gIHdoaWxlICgobmFpdmVJbmRleEEgPCBzdHJpbmdBTmFpdmVMZW5ndGgpIHx8IChuYWl2ZUluZGV4QiA8IHN0cmluZ0JOYWl2ZUxlbmd0aCkpIHtcbiAgICBjb25zdCBjb2RlUG9pbnRBID0gKG5haXZlSW5kZXhBIDwgc3RyaW5nQU5haXZlTGVuZ3RoKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQS5jb2RlUG9pbnRBdChuYWl2ZUluZGV4QSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICBjb2RlUG9pbnRCID0gKG5haXZlSW5kZXhCIDwgc3RyaW5nQk5haXZlTGVuZ3RoKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQi5jb2RlUG9pbnRBdChuYWl2ZUluZGV4QikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgMDtcblxuICAgIGRpZmZlcmVuY2UgPSAoY29kZVBvaW50QSAtIGNvZGVQb2ludEIpO1xuXG4gICAgaWYgKGRpZmZlcmVuY2UgIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5haXZlSW5kZXhBICs9IChjb2RlUG9pbnRBID4gMHhGRkZGKSA/XG4gICAgICAgICAgICAgICAgMiA6XG4gICAgICAgICAgICAgICAgICAxO1xuXG4gICAgbmFpdmVJbmRleEIgKz0gKGNvZGVQb2ludEIgPiAweEZGRkYpID9cbiAgICAgICAgICAgICAgICAyIDpcbiAgICAgICAgICAgICAgICAgIDE7XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZGV4T2Yoc3RyaW5nLCBzZWFyY2hTdHJpbmcpIHtcbiAgbGV0IGluZGV4ID0gLTE7XG5cbiAgY29uc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aDtcblxuICBpZiAoc2VhcmNoU3RyaW5nTGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG91dGVyTmFpdmVJbmRleCA9IHN0cmluZy5pbmRleE9mKHNlYXJjaFN0cmluZyk7XG5cbiAgICBpZiAob3V0ZXJOYWl2ZUluZGV4ID4gLTEpIHtcbiAgICAgIGluZGV4ID0gMDtcblxuICAgICAgbGV0IGlubmVyTmFpdmVJbmRleCA9IDA7XG5cbiAgICAgIHdoaWxlIChpbm5lck5haXZlSW5kZXggPCBvdXRlck5haXZlSW5kZXgpIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpbm5lck5haXZlSW5kZXgpO1xuXG4gICAgICAgIGlubmVyTmFpdmVJbmRleCArPSAoKGNoYXJDb2RlID49IDB4RDgwMCkgJiYgKGNoYXJDb2RlIDw9IDB4REJGRikpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTtcblxuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0cmluZyhzdHJpbmcsIHN0YXJ0LCBlbmQgPSBJbmZpbml0eSkge1xuICBjb25zdCBzdHJpbmdOYWl2ZUxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgbGV0IGluZGV4ID0gMCxcbiAgICAgIG5haXZlSW5kZXggPSAwLFxuICAgICAgbmFpdmVTdGFydCA9IHN0cmluZ05haXZlTGVuZ3RoLCAvLy9cbiAgICAgIG5haXZlRW5kID0gc3RyaW5nTmFpdmVMZW5ndGg7IC8vL1xuXG4gIHdoaWxlIChuYWl2ZUluZGV4IDwgc3RyaW5nTmFpdmVMZW5ndGgpIHtcbiAgICBpZiAoaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICBuYWl2ZVN0YXJ0ID0gbmFpdmVJbmRleDsgIC8vL1xuICAgIH1cblxuICAgIGlmIChpbmRleCA9PT0gZW5kKSB7XG4gICAgICBuYWl2ZUVuZCA9IG5haXZlSW5kZXg7ICAvLy9cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhckNvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChuYWl2ZUluZGV4KTtcblxuICAgIG5haXZlSW5kZXggKz0gKChjaGFyQ29kZSA+PSAweEQ4MDApICYmIChjaGFyQ29kZSA8PSAweERCRkYpKSA/XG4gICAgICAgICAgICAgICAgICAgIDIgOlxuICAgICAgICAgICAgICAgICAgICAgIDE7XG5cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKGluZGV4ID09PSBzdGFydCkge1xuICAgIG5haXZlU3RhcnQgPSBuYWl2ZUluZGV4OyAgLy8vXG4gIH1cblxuICBpZiAoaW5kZXggPT09IGVuZCkge1xuICAgIG5haXZlRW5kID0gbmFpdmVJbmRleDsgIC8vL1xuICB9XG5cbiAgY29uc3Qgc3Vic3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhuYWl2ZVN0YXJ0LCBuYWl2ZUVuZCk7XG5cbiAgcmV0dXJuIHN1YnN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBzdHJjbXAsXG4gIHN0cmxlbixcbiAgaW5kZXhPZixcbiAgc3Vic3RyaW5nXG59O1xuIl0sIm5hbWVzIjpbImluZGV4T2YiLCJzdHJjbXAiLCJzdHJsZW4iLCJzdWJzdHJpbmciLCJzdHJpbmciLCJsZW5ndGgiLCJfIiwic3RyaW5nQSIsInN0cmluZ0IiLCJkaWZmZXJlbmNlIiwibmFpdmVJbmRleEEiLCJuYWl2ZUluZGV4QiIsInN0cmluZ0FOYWl2ZUxlbmd0aCIsInN0cmluZ0JOYWl2ZUxlbmd0aCIsImNvZGVQb2ludEEiLCJjb2RlUG9pbnRBdCIsImNvZGVQb2ludEIiLCJzZWFyY2hTdHJpbmciLCJpbmRleCIsInNlYXJjaFN0cmluZ0xlbmd0aCIsIm91dGVyTmFpdmVJbmRleCIsImlubmVyTmFpdmVJbmRleCIsImNoYXJDb2RlIiwiY2hhckNvZGVBdCIsInN0YXJ0IiwiZW5kIiwiSW5maW5pdHkiLCJzdHJpbmdOYWl2ZUxlbmd0aCIsIm5haXZlSW5kZXgiLCJuYWl2ZVN0YXJ0IiwibmFpdmVFbmQiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQW9IQTtlQUFBOztRQXJFZ0JBO2VBQUFBOztRQW5DQUM7ZUFBQUE7O1FBVkFDO2VBQUFBOztRQXlFQUM7ZUFBQUE7OztBQXpFVCxTQUFTRCxPQUFPRSxNQUFNO0lBQzNCLElBQUlDLFNBQVM7SUFFYixLQUFLLE1BQU1DLEtBQUtGLE9BQVE7UUFDdEJDO0lBQ0Y7SUFFQSxPQUFPQTtBQUNUO0FBRU8sU0FBU0osT0FBT00sT0FBTyxFQUFFQyxPQUFPO0lBQ3JDLElBQUlDLGFBQWE7SUFFakIsSUFBSUMsY0FBYyxHQUNkQyxjQUFjO0lBRWxCLE1BQU1DLHFCQUFxQkwsUUFBUUYsTUFBTSxFQUNuQ1EscUJBQXFCTCxRQUFRSCxNQUFNO0lBRXpDLE1BQU8sQUFBQ0ssY0FBY0Usc0JBQXdCRCxjQUFjRSxtQkFBcUI7UUFDL0UsTUFBTUMsYUFBYSxBQUFDSixjQUFjRSxxQkFDYkwsUUFBUVEsV0FBVyxDQUFDTCxlQUNsQixHQUNqQk0sYUFBYSxBQUFDTCxjQUFjRSxxQkFDYkwsUUFBUU8sV0FBVyxDQUFDSixlQUNsQjtRQUV2QkYsYUFBY0ssYUFBYUU7UUFFM0IsSUFBSVAsZUFBZSxHQUFHO1lBQ3BCO1FBQ0Y7UUFFQUMsZUFBZSxBQUFDSSxhQUFhLFNBQ2pCLElBQ0U7UUFFZEgsZUFBZSxBQUFDSyxhQUFhLFNBQ2pCLElBQ0U7SUFDaEI7SUFFQSxPQUFPUDtBQUNUO0FBRU8sU0FBU1QsUUFBUUksTUFBTSxFQUFFYSxZQUFZO0lBQzFDLElBQUlDLFFBQVEsQ0FBQztJQUViLE1BQU1DLHFCQUFxQkYsYUFBYVosTUFBTTtJQUU5QyxJQUFJYyxxQkFBcUIsR0FBRztRQUMxQixNQUFNQyxrQkFBa0JoQixPQUFPSixPQUFPLENBQUNpQjtRQUV2QyxJQUFJRyxrQkFBa0IsQ0FBQyxHQUFHO1lBQ3hCRixRQUFRO1lBRVIsSUFBSUcsa0JBQWtCO1lBRXRCLE1BQU9BLGtCQUFrQkQsZ0JBQWlCO2dCQUN4QyxNQUFNRSxXQUFXbEIsT0FBT21CLFVBQVUsQ0FBQ0Y7Z0JBRW5DQSxtQkFBbUIsQUFBQyxBQUFDQyxZQUFZLFVBQVlBLFlBQVksU0FDcEMsSUFDRTtnQkFFdkJKO1lBQ0Y7UUFDRjtJQUNGO0lBRUEsT0FBT0E7QUFDVDtBQUVPLFNBQVNmLFVBQVVDLE1BQU0sRUFBRW9CLEtBQUssRUFBRUMsTUFBTUMsUUFBUTtJQUNyRCxNQUFNQyxvQkFBb0J2QixPQUFPQyxNQUFNO0lBRXZDLElBQUlhLFFBQVEsR0FDUlUsYUFBYSxHQUNiQyxhQUFhRixtQkFDYkcsV0FBV0gsbUJBQW1CLEdBQUc7SUFFckMsTUFBT0MsYUFBYUQsa0JBQW1CO1FBQ3JDLElBQUlULFVBQVVNLE9BQU87WUFDbkJLLGFBQWFELFlBQWEsR0FBRztRQUMvQjtRQUVBLElBQUlWLFVBQVVPLEtBQUs7WUFDakJLLFdBQVdGLFlBQWEsR0FBRztZQUUzQjtRQUNGO1FBRUEsTUFBTU4sV0FBV2xCLE9BQU9tQixVQUFVLENBQUNLO1FBRW5DQSxjQUFjLEFBQUMsQUFBQ04sWUFBWSxVQUFZQSxZQUFZLFNBQ3BDLElBQ0U7UUFFbEJKO0lBQ0Y7SUFFQSxJQUFJQSxVQUFVTSxPQUFPO1FBQ25CSyxhQUFhRCxZQUFhLEdBQUc7SUFDL0I7SUFFQSxJQUFJVixVQUFVTyxLQUFLO1FBQ2pCSyxXQUFXRixZQUFhLEdBQUc7SUFDN0I7SUFFQSxNQUFNekIsYUFBWUMsT0FBT0QsU0FBUyxDQUFDMEIsWUFBWUM7SUFFL0MsT0FBTzNCO0FBQ1Q7TUFFQSxXQUFlO0lBQ2JGO0lBQ0FDO0lBQ0FGO0lBQ0FHO0FBQ0YifQ==
|
package/package.json
CHANGED
package/src/utilities/string.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
25
|
-
|
|
16
|
+
let naiveIndexA = 0,
|
|
17
|
+
naiveIndexB = 0;
|
|
26
18
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
codePointA,
|
|
30
|
-
codePointB;
|
|
19
|
+
const stringANaiveLength = stringA.length,
|
|
20
|
+
stringBNaiveLength = stringB.length;
|
|
31
21
|
|
|
32
|
-
while (
|
|
33
|
-
codePointA =
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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 =
|
|
30
|
+
difference = (codePointA - codePointB);
|
|
41
31
|
|
|
42
32
|
if (difference !== 0) {
|
|
43
33
|
break;
|
|
44
34
|
}
|
|
45
35
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
36
|
+
naiveIndexA += (codePointA > 0xFFFF) ?
|
|
37
|
+
2 :
|
|
38
|
+
1;
|
|
49
39
|
|
|
50
|
-
|
|
51
|
-
|
|
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 =
|
|
51
|
+
const searchStringLength = searchString.length;
|
|
62
52
|
|
|
63
53
|
if (searchStringLength > 0) {
|
|
64
|
-
|
|
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
|
-
|
|
56
|
+
if (outerNaiveIndex > -1) {
|
|
57
|
+
index = 0;
|
|
71
58
|
|
|
72
|
-
|
|
59
|
+
let innerNaiveIndex = 0;
|
|
73
60
|
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
82
|
-
|
|
64
|
+
innerNaiveIndex += ((charCode >= 0xD800) && (charCode <= 0xDBFF)) ?
|
|
65
|
+
2 :
|
|
66
|
+
1;
|
|
83
67
|
|
|
84
|
-
|
|
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
|
-
|
|
77
|
+
const stringNaiveLength = string.length;
|
|
103
78
|
|
|
104
|
-
|
|
105
|
-
|
|
79
|
+
let index = 0,
|
|
80
|
+
naiveIndex = 0,
|
|
81
|
+
naiveStart = stringNaiveLength, ///
|
|
82
|
+
naiveEnd = stringNaiveLength; ///
|
|
106
83
|
|
|
107
|
-
|
|
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
|
-
|
|
115
|
-
characters.push(character.value); ///
|
|
116
|
-
}
|
|
95
|
+
const charCode = string.charCodeAt(naiveIndex);
|
|
117
96
|
|
|
118
|
-
|
|
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
|
-
|
|
108
|
+
if (index === end) {
|
|
109
|
+
naiveEnd = naiveIndex; ///
|
|
121
110
|
}
|
|
122
111
|
|
|
123
|
-
const substring =
|
|
112
|
+
const substring = string.substring(naiveStart, naiveEnd);
|
|
124
113
|
|
|
125
114
|
return substring;
|
|
126
115
|
}
|