cmpstr 3.2.1 → 3.3.0

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.
Files changed (155) hide show
  1. package/README.md +24 -18
  2. package/dist/CmpStr.esm.js +1904 -1211
  3. package/dist/CmpStr.esm.min.js +2 -3
  4. package/dist/CmpStr.umd.js +1924 -1236
  5. package/dist/CmpStr.umd.min.js +2 -3
  6. package/dist/cjs/CmpStr.cjs +134 -64
  7. package/dist/cjs/CmpStrAsync.cjs +60 -37
  8. package/dist/cjs/index.cjs +1 -2
  9. package/dist/cjs/metric/Cosine.cjs +1 -2
  10. package/dist/cjs/metric/DamerauLevenshtein.cjs +1 -2
  11. package/dist/cjs/metric/DiceSorensen.cjs +1 -2
  12. package/dist/cjs/metric/Hamming.cjs +5 -4
  13. package/dist/cjs/metric/Jaccard.cjs +1 -2
  14. package/dist/cjs/metric/JaroWinkler.cjs +1 -2
  15. package/dist/cjs/metric/LCS.cjs +1 -2
  16. package/dist/cjs/metric/Levenshtein.cjs +1 -2
  17. package/dist/cjs/metric/Metric.cjs +90 -53
  18. package/dist/cjs/metric/NeedlemanWunsch.cjs +1 -2
  19. package/dist/cjs/metric/QGram.cjs +1 -2
  20. package/dist/cjs/metric/SmithWaterman.cjs +1 -2
  21. package/dist/cjs/phonetic/Caverphone.cjs +1 -2
  22. package/dist/cjs/phonetic/Cologne.cjs +1 -2
  23. package/dist/cjs/phonetic/Metaphone.cjs +1 -2
  24. package/dist/cjs/phonetic/Phonetic.cjs +80 -48
  25. package/dist/cjs/phonetic/Soundex.cjs +1 -2
  26. package/dist/cjs/root.cjs +6 -3
  27. package/dist/cjs/utils/DeepMerge.cjs +109 -99
  28. package/dist/cjs/utils/DiffChecker.cjs +1 -2
  29. package/dist/cjs/utils/Errors.cjs +106 -0
  30. package/dist/cjs/utils/Filter.cjs +97 -37
  31. package/dist/cjs/utils/HashTable.cjs +44 -30
  32. package/dist/cjs/utils/Normalizer.cjs +84 -35
  33. package/dist/cjs/utils/OptionsValidator.cjs +211 -0
  34. package/dist/cjs/utils/Pool.cjs +57 -19
  35. package/dist/cjs/utils/Profiler.cjs +41 -28
  36. package/dist/cjs/utils/Registry.cjs +48 -24
  37. package/dist/cjs/utils/StructuredData.cjs +95 -57
  38. package/dist/cjs/utils/TextAnalyzer.cjs +1 -2
  39. package/dist/esm/CmpStr.mjs +133 -61
  40. package/dist/esm/CmpStrAsync.mjs +56 -33
  41. package/dist/esm/index.mjs +1 -2
  42. package/dist/esm/metric/Cosine.mjs +1 -2
  43. package/dist/esm/metric/DamerauLevenshtein.mjs +1 -2
  44. package/dist/esm/metric/DiceSorensen.mjs +1 -2
  45. package/dist/esm/metric/Hamming.mjs +5 -4
  46. package/dist/esm/metric/Jaccard.mjs +1 -2
  47. package/dist/esm/metric/JaroWinkler.mjs +1 -2
  48. package/dist/esm/metric/LCS.mjs +1 -2
  49. package/dist/esm/metric/Levenshtein.mjs +1 -2
  50. package/dist/esm/metric/Metric.mjs +92 -53
  51. package/dist/esm/metric/NeedlemanWunsch.mjs +1 -2
  52. package/dist/esm/metric/QGram.mjs +1 -2
  53. package/dist/esm/metric/SmithWaterman.mjs +1 -2
  54. package/dist/esm/phonetic/Caverphone.mjs +1 -2
  55. package/dist/esm/phonetic/Cologne.mjs +1 -2
  56. package/dist/esm/phonetic/Metaphone.mjs +1 -2
  57. package/dist/esm/phonetic/Phonetic.mjs +83 -48
  58. package/dist/esm/phonetic/Soundex.mjs +1 -2
  59. package/dist/esm/root.mjs +5 -4
  60. package/dist/esm/utils/DeepMerge.mjs +109 -95
  61. package/dist/esm/utils/DiffChecker.mjs +1 -2
  62. package/dist/esm/utils/Errors.mjs +106 -0
  63. package/dist/esm/utils/Filter.mjs +97 -37
  64. package/dist/esm/utils/HashTable.mjs +44 -30
  65. package/dist/esm/utils/Normalizer.mjs +84 -35
  66. package/dist/esm/utils/OptionsValidator.mjs +210 -0
  67. package/dist/esm/utils/Pool.mjs +53 -19
  68. package/dist/esm/utils/Profiler.mjs +41 -28
  69. package/dist/esm/utils/Registry.mjs +48 -24
  70. package/dist/esm/utils/StructuredData.mjs +95 -57
  71. package/dist/esm/utils/TextAnalyzer.mjs +1 -2
  72. package/dist/types/CmpStr.d.ts +25 -14
  73. package/dist/types/CmpStrAsync.d.ts +4 -0
  74. package/dist/types/index.d.ts +3 -2
  75. package/dist/types/metric/Metric.d.ts +15 -14
  76. package/dist/types/phonetic/Phonetic.d.ts +7 -4
  77. package/dist/types/root.d.ts +4 -2
  78. package/dist/types/utils/DeepMerge.d.ts +80 -58
  79. package/dist/types/utils/Errors.d.ts +154 -0
  80. package/dist/types/utils/Filter.d.ts +8 -1
  81. package/dist/types/utils/HashTable.d.ts +12 -11
  82. package/dist/types/utils/Normalizer.d.ts +5 -1
  83. package/dist/types/utils/OptionsValidator.d.ts +193 -0
  84. package/dist/types/utils/Pool.d.ts +2 -0
  85. package/dist/types/utils/Profiler.d.ts +9 -28
  86. package/dist/types/utils/Registry.d.ts +3 -3
  87. package/dist/types/utils/StructuredData.d.ts +6 -1
  88. package/dist/types/utils/Types.d.ts +39 -1
  89. package/package.json +20 -11
  90. package/dist/CmpStr.esm.js.map +0 -1
  91. package/dist/CmpStr.esm.min.js.map +0 -1
  92. package/dist/CmpStr.umd.js.map +0 -1
  93. package/dist/CmpStr.umd.min.js.map +0 -1
  94. package/dist/cjs/CmpStr.cjs.map +0 -1
  95. package/dist/cjs/CmpStrAsync.cjs.map +0 -1
  96. package/dist/cjs/index.cjs.map +0 -1
  97. package/dist/cjs/metric/Cosine.cjs.map +0 -1
  98. package/dist/cjs/metric/DamerauLevenshtein.cjs.map +0 -1
  99. package/dist/cjs/metric/DiceSorensen.cjs.map +0 -1
  100. package/dist/cjs/metric/Hamming.cjs.map +0 -1
  101. package/dist/cjs/metric/Jaccard.cjs.map +0 -1
  102. package/dist/cjs/metric/JaroWinkler.cjs.map +0 -1
  103. package/dist/cjs/metric/LCS.cjs.map +0 -1
  104. package/dist/cjs/metric/Levenshtein.cjs.map +0 -1
  105. package/dist/cjs/metric/Metric.cjs.map +0 -1
  106. package/dist/cjs/metric/NeedlemanWunsch.cjs.map +0 -1
  107. package/dist/cjs/metric/QGram.cjs.map +0 -1
  108. package/dist/cjs/metric/SmithWaterman.cjs.map +0 -1
  109. package/dist/cjs/phonetic/Caverphone.cjs.map +0 -1
  110. package/dist/cjs/phonetic/Cologne.cjs.map +0 -1
  111. package/dist/cjs/phonetic/Metaphone.cjs.map +0 -1
  112. package/dist/cjs/phonetic/Phonetic.cjs.map +0 -1
  113. package/dist/cjs/phonetic/Soundex.cjs.map +0 -1
  114. package/dist/cjs/root.cjs.map +0 -1
  115. package/dist/cjs/utils/DeepMerge.cjs.map +0 -1
  116. package/dist/cjs/utils/DiffChecker.cjs.map +0 -1
  117. package/dist/cjs/utils/Filter.cjs.map +0 -1
  118. package/dist/cjs/utils/HashTable.cjs.map +0 -1
  119. package/dist/cjs/utils/Normalizer.cjs.map +0 -1
  120. package/dist/cjs/utils/Pool.cjs.map +0 -1
  121. package/dist/cjs/utils/Profiler.cjs.map +0 -1
  122. package/dist/cjs/utils/Registry.cjs.map +0 -1
  123. package/dist/cjs/utils/StructuredData.cjs.map +0 -1
  124. package/dist/cjs/utils/TextAnalyzer.cjs.map +0 -1
  125. package/dist/esm/CmpStr.mjs.map +0 -1
  126. package/dist/esm/CmpStrAsync.mjs.map +0 -1
  127. package/dist/esm/index.mjs.map +0 -1
  128. package/dist/esm/metric/Cosine.mjs.map +0 -1
  129. package/dist/esm/metric/DamerauLevenshtein.mjs.map +0 -1
  130. package/dist/esm/metric/DiceSorensen.mjs.map +0 -1
  131. package/dist/esm/metric/Hamming.mjs.map +0 -1
  132. package/dist/esm/metric/Jaccard.mjs.map +0 -1
  133. package/dist/esm/metric/JaroWinkler.mjs.map +0 -1
  134. package/dist/esm/metric/LCS.mjs.map +0 -1
  135. package/dist/esm/metric/Levenshtein.mjs.map +0 -1
  136. package/dist/esm/metric/Metric.mjs.map +0 -1
  137. package/dist/esm/metric/NeedlemanWunsch.mjs.map +0 -1
  138. package/dist/esm/metric/QGram.mjs.map +0 -1
  139. package/dist/esm/metric/SmithWaterman.mjs.map +0 -1
  140. package/dist/esm/phonetic/Caverphone.mjs.map +0 -1
  141. package/dist/esm/phonetic/Cologne.mjs.map +0 -1
  142. package/dist/esm/phonetic/Metaphone.mjs.map +0 -1
  143. package/dist/esm/phonetic/Phonetic.mjs.map +0 -1
  144. package/dist/esm/phonetic/Soundex.mjs.map +0 -1
  145. package/dist/esm/root.mjs.map +0 -1
  146. package/dist/esm/utils/DeepMerge.mjs.map +0 -1
  147. package/dist/esm/utils/DiffChecker.mjs.map +0 -1
  148. package/dist/esm/utils/Filter.mjs.map +0 -1
  149. package/dist/esm/utils/HashTable.mjs.map +0 -1
  150. package/dist/esm/utils/Normalizer.mjs.map +0 -1
  151. package/dist/esm/utils/Pool.mjs.map +0 -1
  152. package/dist/esm/utils/Profiler.mjs.map +0 -1
  153. package/dist/esm/utils/Registry.mjs.map +0 -1
  154. package/dist/esm/utils/StructuredData.mjs.map +0 -1
  155. package/dist/esm/utils/TextAnalyzer.mjs.map +0 -1
@@ -1,6 +1,7 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
+ var Errors = require('./utils/Errors.cjs');
4
5
  var Filter = require('./utils/Filter.cjs');
5
6
  var Normalizer = require('./utils/Normalizer.cjs');
6
7
  var Registry = require('./utils/Registry.cjs');
@@ -45,27 +46,33 @@ class CmpStrAsync extends CmpStr.CmpStr {
45
46
  async computeAsync(a, b, opt, mode, raw, skip) {
46
47
  const resolved = this.resolveOptions(opt);
47
48
  this.assert('metric', resolved.metric);
48
- const A = skip ? a : await this.prepareAsync(a, resolved);
49
- const B = skip ? b : await this.prepareAsync(b, resolved);
50
- if (
51
- resolved.safeEmpty &&
52
- ((Array.isArray(A) && A.length === 0) ||
53
- (Array.isArray(B) && B.length === 0) ||
54
- A === '' ||
55
- B === '')
56
- ) {
57
- return [];
58
- }
59
- const metric = Registry.factory['metric'](
60
- resolved.metric,
61
- A,
62
- B,
63
- resolved.opt
49
+ return Errors.ErrorUtil.wrapAsync(
50
+ async () => {
51
+ const A = skip ? a : await this.prepareAsync(a, resolved);
52
+ const B = skip ? b : await this.prepareAsync(b, resolved);
53
+ if (
54
+ resolved.safeEmpty &&
55
+ ((Array.isArray(A) && A.length === 0) ||
56
+ (Array.isArray(B) && B.length === 0) ||
57
+ A === '' ||
58
+ B === '')
59
+ ) {
60
+ return [];
61
+ }
62
+ const metric = Registry.factory['metric'](
63
+ resolved.metric,
64
+ A,
65
+ B,
66
+ resolved.opt
67
+ );
68
+ if (resolved.output !== 'prep') metric.setOriginal(a, b);
69
+ await metric.runAsync(mode);
70
+ const result = this.postProcess(metric.getResults(), resolved);
71
+ return this.output(result, raw ?? resolved.raw);
72
+ },
73
+ `Failed to compute metric <${opt?.metric ?? this.options.metric}> for the given inputs`,
74
+ { a, b, opt }
64
75
  );
65
- if (resolved.output !== 'prep') metric.setOriginal(a, b);
66
- await metric.runAsync(mode);
67
- const result = this.postProcess(metric.getResults(), resolved);
68
- return this.output(result, raw ?? resolved.raw);
69
76
  }
70
77
  async testAsync(a, b, opt) {
71
78
  return this.computeAsync(a, b, opt, 'single');
@@ -103,23 +110,40 @@ class CmpStrAsync extends CmpStr.CmpStr {
103
110
  const resolved = this.resolveOptions({ flags, processors });
104
111
  const test = await this.prepareAsync(needle, resolved);
105
112
  const hstk = await this.prepareAsync(haystack, resolved);
106
- return haystack.filter((_, i) => hstk[i].includes(test));
113
+ const out = [];
114
+ for (let i = 0; i < hstk.length; i++) {
115
+ if (hstk[i].includes(test)) out.push(haystack[i]);
116
+ }
117
+ return out;
107
118
  }
108
119
  async matrixAsync(input, opt) {
109
- input = await this.prepareAsync(input, this.resolveOptions(opt));
110
- return Promise.all(
111
- input.map(
112
- async (a) =>
113
- await this.computeAsync(
114
- a,
115
- input,
116
- undefined,
117
- 'batch',
118
- true,
119
- true
120
- ).then((r) => r.map((b) => b.res ?? 0))
121
- )
122
- );
120
+ const resolved = this.resolveOptions(opt);
121
+ const arr = await this.prepareAsync(input, resolved);
122
+ const n = arr.length;
123
+ const out = Array.from({ length: n }, () => new Array(n).fill(0));
124
+ for (let i = 0; i < n; i++) {
125
+ await Promise.all(
126
+ Array.from({ length: n - i }, (_, k) => i + k).map(async (j) => {
127
+ if (i === j) {
128
+ out[i][j] = 1;
129
+ } else {
130
+ const score = (
131
+ await this.computeAsync(
132
+ arr[i],
133
+ arr[j],
134
+ resolved,
135
+ 'single',
136
+ true,
137
+ true
138
+ )
139
+ ).res;
140
+ out[i][j] = score;
141
+ out[j][i] = score;
142
+ }
143
+ })
144
+ );
145
+ }
146
+ return out;
123
147
  }
124
148
  async phoneticIndexAsync(input, algo, opt) {
125
149
  const { algo: a, opt: o } = this.options.processors?.phonetic ?? {};
@@ -165,4 +189,3 @@ class CmpStrAsync extends CmpStr.CmpStr {
165
189
  }
166
190
 
167
191
  exports.CmpStrAsync = CmpStrAsync;
168
- //# sourceMappingURL=CmpStrAsync.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var CmpStr = require('./CmpStr.cjs');
@@ -12,4 +12,3 @@ exports.CmpStrAsync = CmpStrAsync.CmpStrAsync;
12
12
  exports.DiffChecker = DiffChecker.DiffChecker;
13
13
  exports.Normalizer = Normalizer.Normalizer;
14
14
  exports.TextAnalyzer = TextAnalyzer.TextAnalyzer;
15
- //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -43,4 +43,3 @@ class CosineSimilarity extends Metric.Metric {
43
43
  Metric.MetricRegistry.add('cosine', CosineSimilarity);
44
44
 
45
45
  exports.CosineSimilarity = CosineSimilarity;
46
- //# sourceMappingURL=Cosine.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -47,4 +47,3 @@ class DamerauLevenshteinDistance extends Metric.Metric {
47
47
  Metric.MetricRegistry.add('damerau', DamerauLevenshteinDistance);
48
48
 
49
49
  exports.DamerauLevenshteinDistance = DamerauLevenshteinDistance;
50
- //# sourceMappingURL=DamerauLevenshtein.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -36,4 +36,3 @@ class DiceSorensenCoefficient extends Metric.Metric {
36
36
  Metric.MetricRegistry.add('dice', DiceSorensenCoefficient);
37
37
 
38
38
  exports.DiceSorensenCoefficient = DiceSorensenCoefficient;
39
- //# sourceMappingURL=DiceSorensen.cjs.map
@@ -1,7 +1,8 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Metric = require('./Metric.cjs');
5
+ var Errors = require('../utils/Errors.cjs');
5
6
 
6
7
  class HammingDistance extends Metric.Metric {
7
8
  constructor(a, b, opt = {}) {
@@ -14,9 +15,10 @@ class HammingDistance extends Metric.Metric {
14
15
  if (n < maxLen) b = b.padEnd(maxLen, this.options.pad);
15
16
  m = n = maxLen;
16
17
  } else
17
- throw new Error(
18
+ throw new Errors.CmpStrUsageError(
18
19
  `Strings must be of equal length for Hamming Distance, a=${m} and b=${n} given, ` +
19
- `use option.pad for automatic adjustment`
20
+ `use option.pad for automatic adjustment`,
21
+ { a: m, b: n }
20
22
  );
21
23
  }
22
24
  let dist = 0;
@@ -30,4 +32,3 @@ class HammingDistance extends Metric.Metric {
30
32
  Metric.MetricRegistry.add('hamming', HammingDistance);
31
33
 
32
34
  exports.HammingDistance = HammingDistance;
33
- //# sourceMappingURL=Hamming.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -29,4 +29,3 @@ class JaccardIndex extends Metric.Metric {
29
29
  Metric.MetricRegistry.add('jaccard', JaccardIndex);
30
30
 
31
31
  exports.JaccardIndex = JaccardIndex;
32
- //# sourceMappingURL=Jaccard.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -61,4 +61,3 @@ class JaroWinklerDistance extends Metric.Metric {
61
61
  Metric.MetricRegistry.add('jaroWinkler', JaroWinklerDistance);
62
62
 
63
63
  exports.JaroWinklerDistance = JaroWinklerDistance;
64
- //# sourceMappingURL=JaroWinkler.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -36,4 +36,3 @@ class LCSMetric extends Metric.Metric {
36
36
  Metric.MetricRegistry.add('lcs', LCSMetric);
37
37
 
38
38
  exports.LCSMetric = LCSMetric;
39
- //# sourceMappingURL=LCS.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -36,4 +36,3 @@ class LevenshteinDistance extends Metric.Metric {
36
36
  Metric.MetricRegistry.add('levenshtein', LevenshteinDistance);
37
37
 
38
38
  exports.LevenshteinDistance = LevenshteinDistance;
39
- //# sourceMappingURL=Levenshtein.cjs.map
@@ -1,6 +1,7 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
+ var Errors = require('../utils/Errors.cjs');
4
5
  var HashTable = require('../utils/HashTable.cjs');
5
6
  var Profiler = require('../utils/Profiler.cjs');
6
7
  var Registry = require('../utils/Registry.cjs');
@@ -17,15 +18,24 @@ class Metric {
17
18
  optKey;
18
19
  symmetric;
19
20
  results;
20
- static clear = () => this.cache.clear();
21
- static swap = (a, b, m, n) => (m > n ? [b, a, n, m] : [a, b, m, n]);
22
- static clamp = (res) => Math.max(0, Math.min(1, res));
21
+ static clear() {
22
+ this.cache.clear();
23
+ }
24
+ static swap(a, b, m, n) {
25
+ return m > n ? [b, a, n, m] : [a, b, m, n];
26
+ }
27
+ static clamp(res) {
28
+ return Math.max(0, Math.min(1, res));
29
+ }
23
30
  constructor(metric, a, b, opt = {}, symmetric = false) {
24
31
  this.metric = metric;
25
32
  this.a = Array.isArray(a) ? a : [a];
26
33
  this.b = Array.isArray(b) ? b : [b];
27
- if (this.a.length === 0 || this.b.length === 0)
28
- throw new Error(`Inputs <a> and <b> must not be empty`);
34
+ Errors.ErrorUtil.assert(
35
+ this.a.length > 0 && this.b.length > 0,
36
+ `Inputs <a> and <b> must not be empty`,
37
+ { a: this.a, b: this.b }
38
+ );
29
39
  this.options = opt;
30
40
  this.optKey = HashTable.Hasher.fastFNV1a(
31
41
  JSON.stringify(opt, Object.keys(opt).sort())
@@ -38,37 +48,46 @@ class Metric {
38
48
  return undefined;
39
49
  }
40
50
  compute(a, b, m, n, maxLen) {
41
- throw new Error(`Method compute() must be overridden in a subclass`);
51
+ throw new Errors.CmpStrInternalError(
52
+ `Method compute() must be overridden in a subclass`
53
+ );
42
54
  }
43
55
  runSingle(i, j) {
44
- let a = String(this.a[i]),
45
- A = a;
46
- let b = String(this.b[j]),
47
- B = b;
48
- let m = A.length,
49
- n = B.length;
50
- let result = this.preCompute(A, B, m, n);
51
- if (!result) {
52
- result = profiler.run(() => {
53
- if (this.symmetric) [A, B, m, n] = Metric.swap(A, B, m, n);
54
- const key =
55
- Metric.cache.key(this.metric, [A, B], this.symmetric) + this.optKey;
56
- return (
57
- Metric.cache.get(key || '') ??
58
- (() => {
59
- const res = this.compute(A, B, m, n, Math.max(m, n));
60
- if (key) Metric.cache.set(key, res);
61
- return res;
62
- })()
63
- );
64
- });
65
- }
66
- return {
67
- metric: this.metric,
68
- a: this.origA[i] ?? a,
69
- b: this.origB[j] ?? b,
70
- ...result
71
- };
56
+ return Errors.ErrorUtil.wrap(
57
+ () => {
58
+ let a = String(this.a[i]),
59
+ A = a;
60
+ let b = String(this.b[j]),
61
+ B = b;
62
+ let m = A.length,
63
+ n = B.length;
64
+ let result = this.preCompute(A, B, m, n);
65
+ if (!result) {
66
+ result = profiler.run(() => {
67
+ if (this.symmetric) [A, B, m, n] = Metric.swap(A, B, m, n);
68
+ let key = Metric.cache.key(this.metric, [A, B], this.symmetric);
69
+ if (key) key += this.optKey;
70
+ return (
71
+ Metric.cache.get(key || '') ??
72
+ (() => {
73
+ const maxLen = m > n ? m : n;
74
+ const res = this.compute(A, B, m, n, maxLen);
75
+ if (key) Metric.cache.set(key, res);
76
+ return res;
77
+ })()
78
+ );
79
+ });
80
+ }
81
+ return {
82
+ metric: this.metric,
83
+ a: this.origA.length > i ? this.origA[i] : a,
84
+ b: this.origB.length > j ? this.origB[j] : b,
85
+ ...result
86
+ };
87
+ },
88
+ `Failed to compute metric for inputs at indices a[${i}] and b[${j}]`,
89
+ { i, j }
90
+ );
72
91
  }
73
92
  async runSingleAsync(i, j) {
74
93
  return Promise.resolve(this.runSingle(i, j));
@@ -81,11 +100,11 @@ class Metric {
81
100
  this.results = results;
82
101
  }
83
102
  async runBatchAsync() {
84
- const results = [];
103
+ const tasks = [];
85
104
  for (let i = 0; i < this.a.length; i++)
86
105
  for (let j = 0; j < this.b.length; j++)
87
- results.push(await this.runSingleAsync(i, j));
88
- this.results = results;
106
+ tasks.push(this.runSingleAsync(i, j));
107
+ this.results = await Promise.all(tasks);
89
108
  }
90
109
  runPairwise() {
91
110
  const results = [];
@@ -93,29 +112,42 @@ class Metric {
93
112
  this.results = results;
94
113
  }
95
114
  async runPairwiseAsync() {
96
- const results = [];
115
+ const tasks = [];
97
116
  for (let i = 0; i < this.a.length; i++)
98
- results.push(await this.runSingleAsync(i, i));
99
- this.results = results;
117
+ tasks.push(this.runSingleAsync(i, i));
118
+ this.results = await Promise.all(tasks);
100
119
  }
101
120
  setOriginal(a, b) {
102
121
  if (a) this.origA = Array.isArray(a) ? a : [a];
103
122
  if (b) this.origB = Array.isArray(b) ? b : [b];
104
123
  return this;
105
124
  }
106
- isBatch = () => this.a.length > 1 || this.b.length > 1;
107
- isSingle = () => !this.isBatch();
125
+ isBatch() {
126
+ return this.a.length > 1 || this.b.length > 1;
127
+ }
128
+ isSingle() {
129
+ return !this.isBatch();
130
+ }
108
131
  isPairwise(safe = false) {
109
132
  return this.isBatch() && this.a.length === this.b.length
110
133
  ? true
111
134
  : !safe &&
112
135
  (() => {
113
- throw new Error(`Mode <pairwise> requires arrays of equal length`);
136
+ throw new Errors.CmpStrUsageError(
137
+ `Mode <pairwise> requires arrays of equal length`,
138
+ { a: this.a, b: this.b }
139
+ );
114
140
  })();
115
141
  }
116
- isSymmetrical = () => this.symmetric;
117
- whichMode = (mode) => mode ?? this.options?.mode ?? 'default';
118
- clear = () => (this.results = undefined);
142
+ isSymmetrical() {
143
+ return this.symmetric;
144
+ }
145
+ whichMode(mode) {
146
+ return mode ?? this.options.mode ?? 'default';
147
+ }
148
+ clear() {
149
+ this.results = undefined;
150
+ }
119
151
  run(mode, clear = true) {
120
152
  if (clear) this.clear();
121
153
  switch (this.whichMode(mode)) {
@@ -134,7 +166,7 @@ class Metric {
134
166
  if (this.isPairwise()) this.runPairwise();
135
167
  break;
136
168
  default:
137
- throw new Error(`Unsupported mode <${mode}>`);
169
+ throw new Errors.CmpStrInternalError(`Unsupported mode <${mode}>`);
138
170
  }
139
171
  }
140
172
  async runAsync(mode, clear = true) {
@@ -155,13 +187,19 @@ class Metric {
155
187
  if (this.isPairwise()) await this.runPairwiseAsync();
156
188
  break;
157
189
  default:
158
- throw new Error(`Unsupported async mode <${mode}>`);
190
+ throw new Errors.CmpStrInternalError(
191
+ `Unsupported async mode <${mode}>`
192
+ );
159
193
  }
160
194
  }
161
- getMetricName = () => this.metric;
195
+ getMetricName() {
196
+ return this.metric;
197
+ }
162
198
  getResults() {
163
- if (this.results === undefined)
164
- throw new Error(`run() must be called before getResult()`);
199
+ Errors.ErrorUtil.assert(
200
+ this.results !== undefined,
201
+ `run() must be called before getResults()`
202
+ );
165
203
  return this.results;
166
204
  }
167
205
  }
@@ -169,4 +207,3 @@ const MetricRegistry = Registry.Registry('metric', Metric);
169
207
 
170
208
  exports.Metric = Metric;
171
209
  exports.MetricRegistry = MetricRegistry;
172
- //# sourceMappingURL=Metric.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -43,4 +43,3 @@ class NeedlemanWunschDistance extends Metric.Metric {
43
43
  Metric.MetricRegistry.add('needlemanWunsch', NeedlemanWunschDistance);
44
44
 
45
45
  exports.NeedlemanWunschDistance = NeedlemanWunschDistance;
46
- //# sourceMappingURL=NeedlemanWunsch.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -37,4 +37,3 @@ class QGramSimilarity extends Metric.Metric {
37
37
  Metric.MetricRegistry.add('qGram', QGramSimilarity);
38
38
 
39
39
  exports.QGramSimilarity = QGramSimilarity;
40
- //# sourceMappingURL=QGram.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Pool = require('../utils/Pool.cjs');
@@ -44,4 +44,3 @@ class SmithWatermanDistance extends Metric.Metric {
44
44
  Metric.MetricRegistry.add('smithWaterman', SmithWatermanDistance);
45
45
 
46
46
  exports.SmithWatermanDistance = SmithWatermanDistance;
47
- //# sourceMappingURL=SmithWaterman.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Phonetic = require('./Phonetic.cjs');
@@ -116,4 +116,3 @@ Phonetic.PhoneticMappingRegistry.add('caverphone', 'en2', {
116
116
  });
117
117
 
118
118
  exports.Caverphone = Caverphone;
119
- //# sourceMappingURL=Caverphone.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Phonetic = require('./Phonetic.cjs');
@@ -67,4 +67,3 @@ Phonetic.PhoneticMappingRegistry.add('cologne', 'default', {
67
67
  });
68
68
 
69
69
  exports.Cologne = Cologne;
70
- //# sourceMappingURL=Cologne.cjs.map
@@ -1,4 +1,4 @@
1
- // CmpStr v3.2.1 build-3439ccb-260130 by Paul Köhler @komed3 / MIT License
1
+ // CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
2
2
  'use strict';
3
3
 
4
4
  var Phonetic = require('./Phonetic.cjs');
@@ -97,4 +97,3 @@ Phonetic.PhoneticMappingRegistry.add('metaphone', 'en90', {
97
97
  });
98
98
 
99
99
  exports.Metaphone = Metaphone;
100
- //# sourceMappingURL=Metaphone.cjs.map