necessary 13.0.6 → 13.0.8

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
@@ -911,11 +911,22 @@ Ideally the `host` argument should not include a trailing forward slash whereas
911
911
 
912
912
  ## String utilities
913
913
 
914
- - `strcmp()`
915
914
  - `strlen()`
915
+ - `strcmp()`
916
916
  - `substring()`
917
917
 
918
- Substitute functions with support for Unicode. Specifically, characters in Unicode astral plains are counted twice in native functions. These functions fix this issue by converting strings to arrays and if necessary back again. Be warned that for this reason they are nowhere near as fast as their native counterparts.
918
+ String functions with support for Unicode. Specifically, characters in Unicode astral plains are counted twice in native string functions and methods whereas these functions effectively count astral Unicode characters only once.
919
+
920
+ Note that although the `strlen()` function uses a regular expression to count the number of astral Unicode characters and is therefore relatively fast, the other two functions convert strings to arrays and if necessary back again. Be warned that for this reason they are nowhere near as fast as their native counterparts.
921
+
922
+ * The `strlen()` function takes a single `string` argument. It works in much the same way as the `length` property of the `String` prototype, however it is Unicode safe:
923
+
924
+ ```
925
+ "𝔸𝔹C".length = 5 // The 𝔹 and C characters are in an astral plane and count as two each.
926
+
927
+ strlen("𝔸𝔹C") = 3 // The string is converted to an array whose length is 3.
928
+
929
+ ```
919
930
 
920
931
  * The `strcmp` function takes `stringA` and `stringB` arguments. It compares them character by character in order to find the lexicographically lesser of the two. Its return value is the difference between the code points of the first differing characters, with the code point of either string given as zero if it is empty. Some examples should clarify:
921
932
 
@@ -939,15 +950,6 @@ Note that, conceptually speaking, the first argument is taken away from the seco
939
950
 
940
951
  Note also that the double-struck `C` is in the basic multilingual plane and has code point `0x02102` whereas the double-struck `𝔸` is in an astral plane and has code point `0x1D538`, therefore their difference is positive.
941
952
 
942
- * The `strlen()` function takes a single `string` argument. It works in much the same way as the `length` property of the `String` prototype, however it is Unicode safe:
943
-
944
- ```
945
- "𝔸𝔹C".length = 5 // The 𝔹 and C characters are in an astral plane and count as two each.
946
-
947
- strlen("𝔸𝔹C") = 3 // The string is converted to an array whose length is 3.
948
-
949
- ```
950
-
951
953
  * The `substring()` function takes `string` and `start` arguments and an optional `end` argument. It works in much the same way as the `substring()` method of the `String` prototype, however it is Unicode safe:
952
954
 
953
955
  ```
package/lib/constants.js CHANGED
@@ -36,10 +36,14 @@ _export(exports, {
36
36
  STRING: function() {
37
37
  return STRING;
38
38
  },
39
+ UG: function() {
40
+ return UG;
41
+ },
39
42
  ZERO: function() {
40
43
  return ZERO;
41
44
  }
42
45
  });
46
+ var UG = "ug";
43
47
  var ZERO = "0";
44
48
  var DATA = "data";
45
49
  var ERROR = "error";
@@ -51,4 +55,4 @@ var ENVIRONMENT = "ENVIRONMENT";
51
55
  var EMPTY_STRING = "";
52
56
  var PACKAGE_JSON = "package.json";
53
57
 
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBjb25zdCBaRVJPID0gXCIwXCI7XG5leHBvcnQgY29uc3QgREFUQSA9IFwiZGF0YVwiO1xuZXhwb3J0IGNvbnN0IEVSUk9SID0gXCJlcnJvclwiO1xuZXhwb3J0IGNvbnN0IFNUUklORyA9IFwic3RyaW5nXCI7XG5leHBvcnQgY29uc3QgTlVNQkVSID0gXCJudW1iZXJcIjtcbmV4cG9ydCBjb25zdCBCT09MRUFOID0gXCJib29sZWFuXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVCA9IFwiZGVmYXVsdFwiO1xuZXhwb3J0IGNvbnN0IEVOVklST05NRU5UID0gXCJFTlZJUk9OTUVOVFwiO1xuZXhwb3J0IGNvbnN0IEVNUFRZX1NUUklORyA9IFwiXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9KU09OID0gXCJwYWNrYWdlLmpzb25cIjtcbiJdLCJuYW1lcyI6WyJCT09MRUFOIiwiREFUQSIsIkRFRkFVTFQiLCJFTVBUWV9TVFJJTkciLCJFTlZJUk9OTUVOVCIsIkVSUk9SIiwiTlVNQkVSIiwiUEFDS0FHRV9KU09OIiwiU1RSSU5HIiwiWkVSTyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0lBT2FBLE9BQU87ZUFBUEE7O0lBSkFDLElBQUk7ZUFBSkE7O0lBS0FDLE9BQU87ZUFBUEE7O0lBRUFDLFlBQVk7ZUFBWkE7O0lBREFDLFdBQVc7ZUFBWEE7O0lBTEFDLEtBQUs7ZUFBTEE7O0lBRUFDLE1BQU07ZUFBTkE7O0lBS0FDLFlBQVk7ZUFBWkE7O0lBTkFDLE1BQU07ZUFBTkE7O0lBSEFDLElBQUk7ZUFBSkE7OztBQUFOLElBQU1BLE9BQU87QUFDYixJQUFNUixPQUFPO0FBQ2IsSUFBTUksUUFBUTtBQUNkLElBQU1HLFNBQVM7QUFDZixJQUFNRixTQUFTO0FBQ2YsSUFBTU4sVUFBVTtBQUNoQixJQUFNRSxVQUFVO0FBQ2hCLElBQU1FLGNBQWM7QUFDcEIsSUFBTUQsZUFBZTtBQUNyQixJQUFNSSxlQUFlIn0=
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBjb25zdCBVRyA9IFwidWdcIjtcbmV4cG9ydCBjb25zdCBaRVJPID0gXCIwXCI7XG5leHBvcnQgY29uc3QgREFUQSA9IFwiZGF0YVwiO1xuZXhwb3J0IGNvbnN0IEVSUk9SID0gXCJlcnJvclwiO1xuZXhwb3J0IGNvbnN0IFNUUklORyA9IFwic3RyaW5nXCI7XG5leHBvcnQgY29uc3QgTlVNQkVSID0gXCJudW1iZXJcIjtcbmV4cG9ydCBjb25zdCBCT09MRUFOID0gXCJib29sZWFuXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVCA9IFwiZGVmYXVsdFwiO1xuZXhwb3J0IGNvbnN0IEVOVklST05NRU5UID0gXCJFTlZJUk9OTUVOVFwiO1xuZXhwb3J0IGNvbnN0IEVNUFRZX1NUUklORyA9IFwiXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9KU09OID0gXCJwYWNrYWdlLmpzb25cIjtcbiJdLCJuYW1lcyI6WyJCT09MRUFOIiwiREFUQSIsIkRFRkFVTFQiLCJFTVBUWV9TVFJJTkciLCJFTlZJUk9OTUVOVCIsIkVSUk9SIiwiTlVNQkVSIiwiUEFDS0FHRV9KU09OIiwiU1RSSU5HIiwiVUciLCJaRVJPIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUFRYUEsT0FBTztlQUFQQTs7SUFKQUMsSUFBSTtlQUFKQTs7SUFLQUMsT0FBTztlQUFQQTs7SUFFQUMsWUFBWTtlQUFaQTs7SUFEQUMsV0FBVztlQUFYQTs7SUFMQUMsS0FBSztlQUFMQTs7SUFFQUMsTUFBTTtlQUFOQTs7SUFLQUMsWUFBWTtlQUFaQTs7SUFOQUMsTUFBTTtlQUFOQTs7SUFKQUMsRUFBRTtlQUFGQTs7SUFDQUMsSUFBSTtlQUFKQTs7O0FBRE4sSUFBTUQsS0FBSztBQUNYLElBQU1DLE9BQU87QUFDYixJQUFNVCxPQUFPO0FBQ2IsSUFBTUksUUFBUTtBQUNkLElBQU1HLFNBQVM7QUFDZixJQUFNRixTQUFTO0FBQ2YsSUFBTU4sVUFBVTtBQUNoQixJQUFNRSxVQUFVO0FBQ2hCLElBQU1FLGNBQWM7QUFDcEIsSUFBTUQsZUFBZTtBQUNyQixJQUFNSSxlQUFlIn0=
@@ -48,6 +48,16 @@ function _unsupported_iterable_to_array(o, minLen) {
48
48
  if (n === "Map" || n === "Set") return Array.from(n);
49
49
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
50
50
  }
51
+ var astralCharactersRegExp = new RegExp("[\\u{10000}-\\u{10ffff}]", _constants.UG);
52
+ function strlen(string) {
53
+ var length = string.length;
54
+ var matches = string.match(astralCharactersRegExp);
55
+ if (matches !== null) {
56
+ var astralCharactersLength = matches.length;
57
+ length -= astralCharactersLength;
58
+ }
59
+ return length;
60
+ }
51
61
  function strcmp(stringA, stringB) {
52
62
  var difference;
53
63
  var codePointA = stringA === _constants.EMPTY_STRING ? 0 : stringA.codePointAt(0), codePointB = stringB === _constants.EMPTY_STRING ? 0 : stringB.codePointAt(0);
@@ -59,9 +69,6 @@ function strcmp(stringA, stringB) {
59
69
  }
60
70
  return difference;
61
71
  }
62
- function strlen(string) {
63
- return _to_consumable_array(string).length;
64
- } ///
65
72
  function substring(string, start, end) {
66
73
  return _to_consumable_array(string).slice(start, end).join("");
67
74
  } ///
@@ -71,4 +78,4 @@ var _default = {
71
78
  substring: substring
72
79
  };
73
80
 
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvc3RyaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBFTVBUWV9TVFJJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJjbXAoc3RyaW5nQSwgc3RyaW5nQikge1xuICBsZXQgZGlmZmVyZW5jZTtcblxuICBjb25zdCBjb2RlUG9pbnRBID0gKHN0cmluZ0EgPT09IEVNUFRZX1NUUklORykgP1xuICAgICAgICAgICAgICAgICAgICAgICAwIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdBLmNvZGVQb2ludEF0KDApLFxuICAgICAgICBjb2RlUG9pbnRCID0gKHN0cmluZ0IgPT09IEVNUFRZX1NUUklORykgP1xuICAgICAgICAgICAgICAgICAgICAgICAwIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCLmNvZGVQb2ludEF0KDApO1xuXG4gIGRpZmZlcmVuY2UgPSBjb2RlUG9pbnRCIC0gY29kZVBvaW50QTtcblxuICBpZiAoKGRpZmZlcmVuY2UgPT09IDApICYmIChjb2RlUG9pbnRBICE9PTApICYmIChjb2RlUG9pbnRCICE9PTApKSB7XG4gICAgc3RyaW5nQSA9IHN1YnN0cmluZyhzdHJpbmdBLCAxKTsgLy8vXG5cbiAgICBzdHJpbmdCID0gc3Vic3RyaW5nKHN0cmluZ0IsIDEpOyAvLy9cblxuICAgIGRpZmZlcmVuY2UgPSBzdHJjbXAoc3RyaW5nQSwgc3RyaW5nQik7XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmxlbihzdHJpbmcpIHsgcmV0dXJuIFsuLi5zdHJpbmddLmxlbmd0aDsgfSAvLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0cmluZyhzdHJpbmcsIHN0YXJ0LCBlbmQpIHsgcmV0dXJuIFsuLi5zdHJpbmddLnNsaWNlKHN0YXJ0LCBlbmQpLmpvaW4oXCJcIik7IH0gIC8vL1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN0cmNtcCxcbiAgc3RybGVuLFxuICBzdWJzdHJpbmdcbn07XG4iXSwibmFtZXMiOlsic3RyY21wIiwic3RybGVuIiwic3Vic3RyaW5nIiwic3RyaW5nQSIsInN0cmluZ0IiLCJkaWZmZXJlbmNlIiwiY29kZVBvaW50QSIsIkVNUFRZX1NUUklORyIsImNvZGVQb2ludEF0IiwiY29kZVBvaW50QiIsInN0cmluZyIsImxlbmd0aCIsInN0YXJ0IiwiZW5kIiwic2xpY2UiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUErQkEsT0FJRTtlQUpGOztJQTNCZ0JBLE1BQU07ZUFBTkE7O0lBdUJBQyxNQUFNO2VBQU5BOztJQUVBQyxTQUFTO2VBQVRBOzs7eUJBM0JhOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV0QixTQUFTRixPQUFPRyxPQUFPLEVBQUVDLE9BQU87SUFDckMsSUFBSUM7SUFFSixJQUFNQyxhQUFhLEFBQUNILFlBQVlJLHVCQUFZLEdBQ3ZCLElBQ0VKLFFBQVFLLFdBQVcsQ0FBQyxJQUNyQ0MsYUFBYSxBQUFDTCxZQUFZRyx1QkFBWSxHQUN2QixJQUNFSCxRQUFRSSxXQUFXLENBQUM7SUFFM0NILGFBQWFJLGFBQWFIO0lBRTFCLElBQUksQUFBQ0QsZUFBZSxLQUFPQyxlQUFjLEtBQU9HLGVBQWMsR0FBSTtRQUNoRU4sVUFBVUQsVUFBVUMsU0FBUyxJQUFJLEdBQUc7UUFFcENDLFVBQVVGLFVBQVVFLFNBQVMsSUFBSSxHQUFHO1FBRXBDQyxhQUFhTCxPQUFPRyxTQUFTQztJQUMvQjtJQUVBLE9BQU9DO0FBQ1Q7QUFFTyxTQUFTSixPQUFPUyxNQUFNO0lBQUksT0FBTyxBQUFDLHFCQUFHQSxRQUFRQyxNQUFNO0FBQUUsRUFBRSxHQUFHO0FBRTFELFNBQVNULFVBQVVRLE1BQU0sRUFBRUUsS0FBSyxFQUFFQyxHQUFHO0lBQUksT0FBTyxBQUFDLHFCQUFHSCxRQUFRSSxLQUFLLENBQUNGLE9BQU9DLEtBQUtFLElBQUksQ0FBQztBQUFLLEVBQUcsR0FBRztJQUVyRyxXQUFlO0lBQ2JmLFFBQUFBO0lBQ0FDLFFBQUFBO0lBQ0FDLFdBQUFBO0FBQ0YifQ==
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvc3RyaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBFTVBUWV9TVFJJTkcsIFVHIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBhc3RyYWxDaGFyYWN0ZXJzUmVnRXhwID0gbmV3IFJlZ0V4cChcIltcXFxcdXsxMDAwMH0tXFxcXHV7MTBmZmZmfV1cIiwgVUcpO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RybGVuKHN0cmluZykge1xuICBsZXQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblxuICBjb25zdCBtYXRjaGVzID0gc3RyaW5nLm1hdGNoKGFzdHJhbENoYXJhY3RlcnNSZWdFeHApO1xuXG4gIGlmIChtYXRjaGVzICE9PSBudWxsKSB7XG4gICAgY29uc3QgeyBsZW5ndGg6IGFzdHJhbENoYXJhY3RlcnNMZW5ndGggfSA9IG1hdGNoZXM7XG5cbiAgICBsZW5ndGggLT0gYXN0cmFsQ2hhcmFjdGVyc0xlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBsZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJjbXAoc3RyaW5nQSwgc3RyaW5nQikge1xuICBsZXQgZGlmZmVyZW5jZTtcblxuICBjb25zdCBjb2RlUG9pbnRBID0gKHN0cmluZ0EgPT09IEVNUFRZX1NUUklORykgP1xuICAgICAgMCA6XG4gICAgICBzdHJpbmdBLmNvZGVQb2ludEF0KDApLFxuICAgIGNvZGVQb2ludEIgPSAoc3RyaW5nQiA9PT0gRU1QVFlfU1RSSU5HKSA/XG4gICAgICAwIDpcbiAgICAgIHN0cmluZ0IuY29kZVBvaW50QXQoMCk7XG5cbiAgZGlmZmVyZW5jZSA9IGNvZGVQb2ludEIgLSBjb2RlUG9pbnRBO1xuXG4gIGlmICgoZGlmZmVyZW5jZSA9PT0gMCkgJiYgKGNvZGVQb2ludEEgIT09MCkgJiYgKGNvZGVQb2ludEIgIT09MCkpIHtcbiAgICBzdHJpbmdBID0gc3Vic3RyaW5nKHN0cmluZ0EsIDEpOyAvLy9cblxuICAgIHN0cmluZ0IgPSBzdWJzdHJpbmcoc3RyaW5nQiwgMSk7IC8vL1xuXG4gICAgZGlmZmVyZW5jZSA9IHN0cmNtcChzdHJpbmdBLCBzdHJpbmdCKTtcbiAgfVxuXG4gIHJldHVybiBkaWZmZXJlbmNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Vic3RyaW5nKHN0cmluZywgc3RhcnQsIGVuZCkgeyByZXR1cm4gWy4uLnN0cmluZ10uc2xpY2Uoc3RhcnQsIGVuZCkuam9pbihcIlwiKTsgfSAgLy8vXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3RyY21wLFxuICBzdHJsZW4sXG4gIHN1YnN0cmluZ1xufTtcbiJdLCJuYW1lcyI6WyJzdHJjbXAiLCJzdHJsZW4iLCJzdWJzdHJpbmciLCJhc3RyYWxDaGFyYWN0ZXJzUmVnRXhwIiwiUmVnRXhwIiwiVUciLCJzdHJpbmciLCJsZW5ndGgiLCJtYXRjaGVzIiwibWF0Y2giLCJhc3RyYWxDaGFyYWN0ZXJzTGVuZ3RoIiwic3RyaW5nQSIsInN0cmluZ0IiLCJkaWZmZXJlbmNlIiwiY29kZVBvaW50QSIsIkVNUFRZX1NUUklORyIsImNvZGVQb2ludEF0IiwiY29kZVBvaW50QiIsInN0YXJ0IiwiZW5kIiwic2xpY2UiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUE2Q0EsT0FJRTtlQUpGOztJQXpCZ0JBLE1BQU07ZUFBTkE7O0lBZEFDLE1BQU07ZUFBTkE7O0lBcUNBQyxTQUFTO2VBQVRBOzs7eUJBekNpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFakMsSUFBTUMseUJBQXlCLElBQUlDLE9BQU8sNEJBQTRCQyxhQUFFO0FBRWpFLFNBQVNKLE9BQU9LLE1BQU07SUFDM0IsSUFBSUMsU0FBU0QsT0FBT0MsTUFBTTtJQUUxQixJQUFNQyxVQUFVRixPQUFPRyxLQUFLLENBQUNOO0lBRTdCLElBQUlLLFlBQVksTUFBTTtRQUNwQixJQUFRRCxBQUFRRyx5QkFBMkJGLFFBQW5DRDtRQUVSQSxVQUFVRztJQUNaO0lBRUEsT0FBT0g7QUFDVDtBQUVPLFNBQVNQLE9BQU9XLE9BQU8sRUFBRUMsT0FBTztJQUNyQyxJQUFJQztJQUVKLElBQU1DLGFBQWEsQUFBQ0gsWUFBWUksdUJBQVksR0FDeEMsSUFDQUosUUFBUUssV0FBVyxDQUFDLElBQ3RCQyxhQUFhLEFBQUNMLFlBQVlHLHVCQUFZLEdBQ3BDLElBQ0FILFFBQVFJLFdBQVcsQ0FBQztJQUV4QkgsYUFBYUksYUFBYUg7SUFFMUIsSUFBSSxBQUFDRCxlQUFlLEtBQU9DLGVBQWMsS0FBT0csZUFBYyxHQUFJO1FBQ2hFTixVQUFVVCxVQUFVUyxTQUFTLElBQUksR0FBRztRQUVwQ0MsVUFBVVYsVUFBVVUsU0FBUyxJQUFJLEdBQUc7UUFFcENDLGFBQWFiLE9BQU9XLFNBQVNDO0lBQy9CO0lBRUEsT0FBT0M7QUFDVDtBQUVPLFNBQVNYLFVBQVVJLE1BQU0sRUFBRVksS0FBSyxFQUFFQyxHQUFHO0lBQUksT0FBTyxBQUFDLHFCQUFHYixRQUFRYyxLQUFLLENBQUNGLE9BQU9DLEtBQUtFLElBQUksQ0FBQztBQUFLLEVBQUcsR0FBRztJQUVyRyxXQUFlO0lBQ2JyQixRQUFBQTtJQUNBQyxRQUFBQTtJQUNBQyxXQUFBQTtBQUNGIn0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "necessary",
3
3
  "author": "James Smith",
4
- "version": "13.0.6",
4
+ "version": "13.0.8",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/necessary",
7
7
  "description": "A collection of utility functions.",
package/src/constants.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ export const UG = "ug";
3
4
  export const ZERO = "0";
4
5
  export const DATA = "data";
5
6
  export const ERROR = "error";
@@ -1,16 +1,32 @@
1
1
  "use strict";
2
2
 
3
- import { EMPTY_STRING } from "../constants";
3
+ import { EMPTY_STRING, UG } from "../constants";
4
+
5
+ const astralCharactersRegExp = new RegExp("[\\u{10000}-\\u{10ffff}]", UG);
6
+
7
+ export function strlen(string) {
8
+ let length = string.length;
9
+
10
+ const matches = string.match(astralCharactersRegExp);
11
+
12
+ if (matches !== null) {
13
+ const { length: astralCharactersLength } = matches;
14
+
15
+ length -= astralCharactersLength;
16
+ }
17
+
18
+ return length;
19
+ }
4
20
 
5
21
  export function strcmp(stringA, stringB) {
6
22
  let difference;
7
23
 
8
24
  const codePointA = (stringA === EMPTY_STRING) ?
9
- 0 :
10
- stringA.codePointAt(0),
11
- codePointB = (stringB === EMPTY_STRING) ?
12
- 0 :
13
- stringB.codePointAt(0);
25
+ 0 :
26
+ stringA.codePointAt(0),
27
+ codePointB = (stringB === EMPTY_STRING) ?
28
+ 0 :
29
+ stringB.codePointAt(0);
14
30
 
15
31
  difference = codePointB - codePointA;
16
32
 
@@ -25,8 +41,6 @@ export function strcmp(stringA, stringB) {
25
41
  return difference;
26
42
  }
27
43
 
28
- export function strlen(string) { return [...string].length; } ///
29
-
30
44
  export function substring(string, start, end) { return [...string].slice(start, end).join(""); } ///
31
45
 
32
46
  export default {