cmpstr 3.0.4 → 3.1.1

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 (92) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +3 -2
  3. package/dist/CmpStr.esm.js +362 -95
  4. package/dist/CmpStr.esm.js.map +1 -1
  5. package/dist/CmpStr.esm.min.js +3 -3
  6. package/dist/CmpStr.esm.min.js.map +1 -1
  7. package/dist/CmpStr.umd.js +363 -94
  8. package/dist/CmpStr.umd.js.map +1 -1
  9. package/dist/CmpStr.umd.min.js +3 -3
  10. package/dist/CmpStr.umd.min.js.map +1 -1
  11. package/dist/cjs/CmpStr.cjs +41 -1
  12. package/dist/cjs/CmpStr.cjs.map +1 -1
  13. package/dist/cjs/CmpStrAsync.cjs +38 -1
  14. package/dist/cjs/CmpStrAsync.cjs.map +1 -1
  15. package/dist/cjs/index.cjs +1 -1
  16. package/dist/cjs/metric/Cosine.cjs +1 -1
  17. package/dist/cjs/metric/DamerauLevenshtein.cjs +1 -1
  18. package/dist/cjs/metric/DiceSorensen.cjs +1 -1
  19. package/dist/cjs/metric/Hamming.cjs +1 -1
  20. package/dist/cjs/metric/Jaccard.cjs +1 -1
  21. package/dist/cjs/metric/JaroWinkler.cjs +1 -1
  22. package/dist/cjs/metric/LCS.cjs +1 -1
  23. package/dist/cjs/metric/Levenshtein.cjs +1 -1
  24. package/dist/cjs/metric/Metric.cjs +1 -1
  25. package/dist/cjs/metric/NeedlemanWunsch.cjs +1 -1
  26. package/dist/cjs/metric/SmithWaterman.cjs +1 -1
  27. package/dist/cjs/metric/qGram.cjs +1 -1
  28. package/dist/cjs/phonetic/Caverphone.cjs +1 -1
  29. package/dist/cjs/phonetic/Cologne.cjs +1 -1
  30. package/dist/cjs/phonetic/Metaphone.cjs +1 -1
  31. package/dist/cjs/phonetic/Phonetic.cjs +1 -1
  32. package/dist/cjs/phonetic/Soundex.cjs +1 -1
  33. package/dist/cjs/root.cjs +13 -1
  34. package/dist/cjs/root.cjs.map +1 -1
  35. package/dist/cjs/utils/DeepMerge.cjs +1 -1
  36. package/dist/cjs/utils/DiffChecker.cjs +1 -1
  37. package/dist/cjs/utils/Filter.cjs +1 -1
  38. package/dist/cjs/utils/HashTable.cjs +6 -6
  39. package/dist/cjs/utils/HashTable.cjs.map +1 -1
  40. package/dist/cjs/utils/Normalizer.cjs +1 -1
  41. package/dist/cjs/utils/Pool.cjs +13 -4
  42. package/dist/cjs/utils/Pool.cjs.map +1 -1
  43. package/dist/cjs/utils/Profiler.cjs +1 -1
  44. package/dist/cjs/utils/Registry.cjs +1 -1
  45. package/dist/cjs/utils/StructuredData.cjs +157 -0
  46. package/dist/cjs/utils/StructuredData.cjs.map +1 -0
  47. package/dist/cjs/utils/TextAnalyzer.cjs +1 -1
  48. package/dist/esm/CmpStr.mjs +41 -1
  49. package/dist/esm/CmpStr.mjs.map +1 -1
  50. package/dist/esm/CmpStrAsync.mjs +38 -1
  51. package/dist/esm/CmpStrAsync.mjs.map +1 -1
  52. package/dist/esm/index.mjs +1 -1
  53. package/dist/esm/metric/Cosine.mjs +1 -1
  54. package/dist/esm/metric/DamerauLevenshtein.mjs +1 -1
  55. package/dist/esm/metric/DiceSorensen.mjs +1 -1
  56. package/dist/esm/metric/Hamming.mjs +1 -1
  57. package/dist/esm/metric/Jaccard.mjs +1 -1
  58. package/dist/esm/metric/JaroWinkler.mjs +1 -1
  59. package/dist/esm/metric/LCS.mjs +1 -1
  60. package/dist/esm/metric/Levenshtein.mjs +1 -1
  61. package/dist/esm/metric/Metric.mjs +1 -1
  62. package/dist/esm/metric/NeedlemanWunsch.mjs +1 -1
  63. package/dist/esm/metric/SmithWaterman.mjs +1 -1
  64. package/dist/esm/metric/qGram.mjs +1 -1
  65. package/dist/esm/phonetic/Caverphone.mjs +1 -1
  66. package/dist/esm/phonetic/Cologne.mjs +1 -1
  67. package/dist/esm/phonetic/Metaphone.mjs +1 -1
  68. package/dist/esm/phonetic/Phonetic.mjs +1 -1
  69. package/dist/esm/phonetic/Soundex.mjs +1 -1
  70. package/dist/esm/root.mjs +7 -1
  71. package/dist/esm/root.mjs.map +1 -1
  72. package/dist/esm/utils/DeepMerge.mjs +1 -1
  73. package/dist/esm/utils/DiffChecker.mjs +1 -1
  74. package/dist/esm/utils/Filter.mjs +1 -1
  75. package/dist/esm/utils/HashTable.mjs +6 -6
  76. package/dist/esm/utils/HashTable.mjs.map +1 -1
  77. package/dist/esm/utils/Normalizer.mjs +1 -1
  78. package/dist/esm/utils/Pool.mjs +13 -4
  79. package/dist/esm/utils/Pool.mjs.map +1 -1
  80. package/dist/esm/utils/Profiler.mjs +1 -1
  81. package/dist/esm/utils/Registry.mjs +1 -1
  82. package/dist/esm/utils/StructuredData.mjs +155 -0
  83. package/dist/esm/utils/StructuredData.mjs.map +1 -0
  84. package/dist/esm/utils/TextAnalyzer.mjs +1 -1
  85. package/dist/types/CmpStr.d.ts +90 -8
  86. package/dist/types/CmpStrAsync.d.ts +82 -8
  87. package/dist/types/index.d.ts +3 -2
  88. package/dist/types/root.d.ts +3 -2
  89. package/dist/types/utils/Pool.d.ts +2 -2
  90. package/dist/types/utils/StructuredData.d.ts +164 -0
  91. package/dist/types/utils/Types.d.ts +43 -1
  92. package/package.json +53 -17
@@ -1,7 +1,7 @@
1
1
  /**
2
- * CmpStr v3.0.4 build-74e65a5-250915
2
+ * CmpStr v3.1.1 build-a140f52-260119
3
3
  * This is a lightweight, fast and well performing library for calculating string similarity.
4
- * (c) 2023-2025 Paul Köhler @komed3 / MIT License
4
+ * (c) 2023-2026 Paul Köhler @komed3 / MIT License
5
5
  * Visit https://github.com/komed3/cmpstr and https://npmjs.org/package/cmpstr
6
6
  */
7
7
  (function (global, factory) {
@@ -23,6 +23,12 @@
23
23
  function get(t, path, fallback) {
24
24
  return parse(path).reduce((o, k) => o?.[k] ?? fallback, t);
25
25
  }
26
+ function has(t, path) {
27
+ return (
28
+ parse(path).reduce((o, k) => (o && k in o ? o[k] : undefined), t) !==
29
+ undefined
30
+ );
31
+ }
26
32
  function set(t, path, value) {
27
33
  if (path === '') return value;
28
34
  const [k, ...r] = parse(path);
@@ -77,6 +83,15 @@
77
83
  return t;
78
84
  }
79
85
 
86
+ var DeepMerge = /*#__PURE__*/ Object.freeze({
87
+ __proto__: null,
88
+ get: get,
89
+ has: has,
90
+ merge: merge,
91
+ rmv: rmv,
92
+ set: set
93
+ });
94
+
80
95
  class Profiler {
81
96
  static ENV;
82
97
  static instance;
@@ -662,11 +677,11 @@
662
677
  const chunks = Math.floor(len / 4);
663
678
  for (let i = 0; i < chunks; i++) {
664
679
  const pos = i * 4;
665
- const chunk =
666
- str.charCodeAt(pos) |
667
- (str.charCodeAt(pos + 1) << 8) |
668
- (str.charCodeAt(pos + 2) << 16) |
669
- (str.charCodeAt(pos + 3) << 24);
680
+ const c0 = str.charCodeAt(pos);
681
+ const c1 = str.charCodeAt(pos + 1);
682
+ const c2 = str.charCodeAt(pos + 2);
683
+ const c3 = str.charCodeAt(pos + 3);
684
+ const chunk = c0 | (c1 << 8) | (c2 << 16) | (c3 << 24);
670
685
  hash ^= chunk;
671
686
  hash *= this.FNV_PRIME;
672
687
  }
@@ -847,6 +862,260 @@
847
862
  }
848
863
  }
849
864
 
865
+ class RingPool {
866
+ maxSize;
867
+ buffers = [];
868
+ pointer = 0;
869
+ constructor(maxSize) {
870
+ this.maxSize = maxSize;
871
+ }
872
+ acquire(minSize, allowOversize) {
873
+ const len = this.buffers.length;
874
+ for (let i = 0; i < len; i++) {
875
+ const idx = (this.pointer + i) % len;
876
+ const item = this.buffers[idx];
877
+ if (item.size >= minSize) {
878
+ this.pointer = (idx + 1) % len;
879
+ return allowOversize || item.size === minSize ? item : null;
880
+ }
881
+ }
882
+ return null;
883
+ }
884
+ release(item) {
885
+ if (this.buffers.length < this.maxSize) {
886
+ this.buffers.push(item);
887
+ } else {
888
+ this.buffers[this.pointer] = item;
889
+ this.pointer = (this.pointer + 1) % this.maxSize;
890
+ }
891
+ }
892
+ clear() {
893
+ this.buffers = [];
894
+ this.pointer = 0;
895
+ }
896
+ }
897
+ class Pool {
898
+ static CONFIG = {
899
+ uint16: {
900
+ type: 'uint16',
901
+ maxSize: 64,
902
+ maxItemSize: 2048,
903
+ allowOversize: true
904
+ },
905
+ 'number[]': {
906
+ type: 'number[]',
907
+ maxSize: 16,
908
+ maxItemSize: 1024,
909
+ allowOversize: false
910
+ },
911
+ 'string[]': {
912
+ type: 'string[]',
913
+ maxSize: 2,
914
+ maxItemSize: 1024,
915
+ allowOversize: false
916
+ },
917
+ set: { type: 'set', maxSize: 8, maxItemSize: 0, allowOversize: false },
918
+ map: { type: 'map', maxSize: 8, maxItemSize: 0, allowOversize: false }
919
+ };
920
+ static POOLS = {
921
+ uint16: new RingPool(64),
922
+ 'number[]': new RingPool(16),
923
+ 'string[]': new RingPool(2),
924
+ set: new RingPool(8),
925
+ map: new RingPool(8)
926
+ };
927
+ static allocate(type, size) {
928
+ switch (type) {
929
+ case 'uint16':
930
+ return new Uint16Array(size);
931
+ case 'number[]':
932
+ return new Float64Array(size);
933
+ case 'string[]':
934
+ return new Array(size);
935
+ case 'set':
936
+ return new Set();
937
+ case 'map':
938
+ return new Map();
939
+ }
940
+ }
941
+ static acquire(type, size) {
942
+ const CONFIG = this.CONFIG[type];
943
+ if (size > CONFIG.maxItemSize) return this.allocate(type, size);
944
+ const item = this.POOLS[type].acquire(size, CONFIG.allowOversize);
945
+ if (item) {
946
+ return type === 'uint16' ? item.buffer.subarray(0, size) : item.buffer;
947
+ }
948
+ return this.allocate(type, size);
949
+ }
950
+ static acquireMany(type, sizes) {
951
+ return sizes.map((size) => this.acquire(type, size));
952
+ }
953
+ static release(type, buffer, size) {
954
+ const CONFIG = this.CONFIG[type];
955
+ if (size <= CONFIG.maxItemSize) {
956
+ this.POOLS[type].release({ buffer, size });
957
+ }
958
+ }
959
+ }
960
+
961
+ class StructuredData {
962
+ static create(data, key) {
963
+ return new StructuredData(data, key);
964
+ }
965
+ data;
966
+ key;
967
+ constructor(data, key) {
968
+ this.data = data;
969
+ this.key = key;
970
+ }
971
+ extractFrom(arr, key) {
972
+ const result = Pool.acquire('string[]', arr.length);
973
+ for (let i = 0; i < arr.length; i++) {
974
+ const val = arr[i][key];
975
+ result[i] = typeof val === 'string' ? val : String(val ?? '');
976
+ }
977
+ return result;
978
+ }
979
+ extract() {
980
+ return this.extractFrom(this.data, this.key);
981
+ }
982
+ isMetricResult(v) {
983
+ return (
984
+ typeof v === 'object' &&
985
+ v !== null &&
986
+ 'a' in v &&
987
+ 'b' in v &&
988
+ 'res' in v
989
+ );
990
+ }
991
+ isCmpStrResult(v) {
992
+ return (
993
+ typeof v === 'object' &&
994
+ v !== null &&
995
+ 'source' in v &&
996
+ 'target' in v &&
997
+ 'match' in v
998
+ );
999
+ }
1000
+ normalizeResults(results) {
1001
+ if (!Array.isArray(results) || results.length === 0) return [];
1002
+ const first = results[0];
1003
+ let normalized = [];
1004
+ if (this.isMetricResult(first)) normalized = results;
1005
+ else if (this.isCmpStrResult(first)) {
1006
+ normalized = results.map((r) => ({
1007
+ metric: 'unknown',
1008
+ a: r.source,
1009
+ b: r.target,
1010
+ res: r.match,
1011
+ raw: r.raw
1012
+ }));
1013
+ }
1014
+ return normalized.map((r, idx) => ({ ...r, __idx: idx }));
1015
+ }
1016
+ rebuild(results, sourceData, extractedStrings, removeZero, objectsOnly) {
1017
+ const stringToIndices = new Map();
1018
+ for (let i = 0; i < extractedStrings.length; i++) {
1019
+ const str = extractedStrings[i];
1020
+ if (!stringToIndices.has(str)) stringToIndices.set(str, []);
1021
+ stringToIndices.get(str).push(i);
1022
+ }
1023
+ const output = new Array(results.length);
1024
+ const occurrenceCount = new Map();
1025
+ let out = 0;
1026
+ for (let i = 0; i < results.length; i++) {
1027
+ const result = results[i];
1028
+ if (removeZero && result.res === 0) continue;
1029
+ const targetStr = result.b || '';
1030
+ const indices = stringToIndices.get(targetStr);
1031
+ let dataIndex;
1032
+ if (indices && indices.length > 0) {
1033
+ const occurrence = occurrenceCount.get(targetStr) ?? 0;
1034
+ occurrenceCount.set(targetStr, occurrence + 1);
1035
+ dataIndex = indices[occurrence % indices.length];
1036
+ } else {
1037
+ dataIndex = result.__idx ?? i;
1038
+ }
1039
+ if (dataIndex < 0 || dataIndex >= sourceData.length) continue;
1040
+ const sourceObj = sourceData[dataIndex];
1041
+ const mappedTarget = extractedStrings[dataIndex] || targetStr;
1042
+ if (objectsOnly) output[out++] = sourceObj;
1043
+ else
1044
+ output[out++] = {
1045
+ obj: sourceObj,
1046
+ key: this.key,
1047
+ result: {
1048
+ source: result.a,
1049
+ target: mappedTarget,
1050
+ match: result.res
1051
+ },
1052
+ ...(result.raw ? { raw: result.raw } : null)
1053
+ };
1054
+ }
1055
+ output.length = out;
1056
+ return output;
1057
+ }
1058
+ sort(results, sort) {
1059
+ if (!sort || results.length <= 1) return results;
1060
+ const asc = sort === 'asc';
1061
+ return results.sort((a, b) => (asc ? a.res - b.res : b.res - a.res));
1062
+ }
1063
+ performLookup(fn, extractedStrings, opt) {
1064
+ return this.rebuild(
1065
+ this.sort(this.normalizeResults(fn()), opt?.sort),
1066
+ this.data,
1067
+ extractedStrings,
1068
+ opt?.removeZero,
1069
+ opt?.objectsOnly
1070
+ );
1071
+ }
1072
+ async performLookupAsync(fn, extractedStrings, opt) {
1073
+ return this.rebuild(
1074
+ this.sort(this.normalizeResults(await fn()), opt?.sort),
1075
+ this.data,
1076
+ extractedStrings,
1077
+ opt?.removeZero,
1078
+ opt?.objectsOnly
1079
+ );
1080
+ }
1081
+ lookup(fn, query, opt) {
1082
+ const b = this.extract();
1083
+ try {
1084
+ return this.performLookup(() => fn(query, b, opt), b, opt);
1085
+ } finally {
1086
+ Pool.release('string[]', b, b.length);
1087
+ }
1088
+ }
1089
+ lookupPairs(fn, other, otherKey, opt) {
1090
+ const a = this.extract();
1091
+ const b = this.extractFrom(other, otherKey);
1092
+ try {
1093
+ return this.performLookup(() => fn(a, b, opt), a, opt);
1094
+ } finally {
1095
+ Pool.release('string[]', a, a.length);
1096
+ Pool.release('string[]', b, b.length);
1097
+ }
1098
+ }
1099
+ async lookupAsync(fn, query, opt) {
1100
+ const b = this.extract();
1101
+ try {
1102
+ return await this.performLookupAsync(() => fn(query, b, opt), b, opt);
1103
+ } finally {
1104
+ Pool.release('string[]', b, b.length);
1105
+ }
1106
+ }
1107
+ async lookupPairsAsync(fn, other, otherKey, opt) {
1108
+ const a = this.extract();
1109
+ const b = this.extractFrom(other, otherKey);
1110
+ try {
1111
+ return await this.performLookupAsync(() => fn(a, b, opt), a, opt);
1112
+ } finally {
1113
+ Pool.release('string[]', a, a.length);
1114
+ Pool.release('string[]', b, b.length);
1115
+ }
1116
+ }
1117
+ }
1118
+
850
1119
  const registry = Object.create(null);
851
1120
  const factory = Object.create(null);
852
1121
  function Registry(reg, ctor) {
@@ -1076,93 +1345,6 @@
1076
1345
  }
1077
1346
  const MetricRegistry = Registry('metric', Metric);
1078
1347
 
1079
- class RingPool {
1080
- maxSize;
1081
- buffers = [];
1082
- pointer = 0;
1083
- constructor(maxSize) {
1084
- this.maxSize = maxSize;
1085
- }
1086
- acquire(minSize, allowOversize) {
1087
- const len = this.buffers.length;
1088
- for (let i = 0; i < len; i++) {
1089
- const idx = (this.pointer + i) % len;
1090
- const item = this.buffers[idx];
1091
- if (item.size >= minSize) {
1092
- this.pointer = (idx + 1) % len;
1093
- return allowOversize || item.size === minSize ? item : null;
1094
- }
1095
- }
1096
- return null;
1097
- }
1098
- release(item) {
1099
- if (this.buffers.length < this.maxSize) {
1100
- this.buffers.push(item);
1101
- } else {
1102
- this.buffers[this.pointer] = item;
1103
- this.pointer = (this.pointer + 1) % this.maxSize;
1104
- }
1105
- }
1106
- clear() {
1107
- this.buffers = [];
1108
- this.pointer = 0;
1109
- }
1110
- }
1111
- class Pool {
1112
- static CONFIG = {
1113
- uint16: {
1114
- type: 'uint16',
1115
- maxSize: 32,
1116
- maxItemSize: 2048,
1117
- allowOversize: true
1118
- },
1119
- 'number[]': {
1120
- type: 'number[]',
1121
- maxSize: 16,
1122
- maxItemSize: 1024,
1123
- allowOversize: false
1124
- },
1125
- set: { type: 'set', maxSize: 8, maxItemSize: 0, allowOversize: false },
1126
- map: { type: 'map', maxSize: 8, maxItemSize: 0, allowOversize: false }
1127
- };
1128
- static POOLS = {
1129
- uint16: new RingPool(32),
1130
- 'number[]': new RingPool(16),
1131
- set: new RingPool(8),
1132
- map: new RingPool(8)
1133
- };
1134
- static allocate(type, size) {
1135
- switch (type) {
1136
- case 'uint16':
1137
- return new Uint16Array(size);
1138
- case 'number[]':
1139
- return new Array(size).fill(0);
1140
- case 'set':
1141
- return new Set();
1142
- case 'map':
1143
- return new Map();
1144
- }
1145
- }
1146
- static acquire(type, size) {
1147
- const CONFIG = this.CONFIG[type];
1148
- if (size > CONFIG.maxItemSize) return this.allocate(type, size);
1149
- const item = this.POOLS[type].acquire(size, CONFIG.allowOversize);
1150
- if (item) {
1151
- return type === 'uint16' ? item.buffer.subarray(0, size) : item.buffer;
1152
- }
1153
- return this.allocate(type, size);
1154
- }
1155
- static acquireMany(type, sizes) {
1156
- return sizes.map((size) => this.acquire(type, size));
1157
- }
1158
- static release(type, buffer, size) {
1159
- const CONFIG = this.CONFIG[type];
1160
- if (size <= CONFIG.maxItemSize) {
1161
- this.POOLS[type].release({ buffer, size });
1162
- }
1163
- }
1164
- }
1165
-
1166
1348
  class CosineSimilarity extends Metric {
1167
1349
  constructor(a, b, opt = {}) {
1168
1350
  super('cosine', a, b, opt, true);
@@ -2155,6 +2337,9 @@
2155
2337
  ? input.map((s) => phonetic.getIndex(s).join(delimiter))
2156
2338
  : phonetic.getIndex(input).join(delimiter);
2157
2339
  }
2340
+ structured(data, key) {
2341
+ return StructuredData.create(data, key);
2342
+ }
2158
2343
  compute(a, b, opt, mode, raw, skip) {
2159
2344
  const resolved = this.resolveOptions(opt);
2160
2345
  this.assert('metric', resolved.metric);
@@ -2288,6 +2473,42 @@
2288
2473
  const { algo: a, opt: o } = this.options.processors?.phonetic ?? {};
2289
2474
  return this.index(input, { algo: algo ?? a, opt: opt ?? o });
2290
2475
  }
2476
+ structuredLookup(query, data, key, opt) {
2477
+ return this.structured(data, key).lookup(
2478
+ (q, items, options) => this.batchTest(q, items, options),
2479
+ query,
2480
+ opt
2481
+ );
2482
+ }
2483
+ structuredMatch(query, data, key, threshold, opt) {
2484
+ return this.structured(data, key).lookup(
2485
+ (q, items, options) => this.match(q, items, threshold, options),
2486
+ query,
2487
+ { ...opt, sort: 'desc' }
2488
+ );
2489
+ }
2490
+ structuredClosest(query, data, key, n = 1, opt) {
2491
+ return this.structured(data, key).lookup(
2492
+ (q, items, options) => this.closest(q, items, n, options),
2493
+ query,
2494
+ { ...opt, sort: 'desc' }
2495
+ );
2496
+ }
2497
+ structuredFurthest(query, data, key, n = 1, opt) {
2498
+ return this.structured(data, key).lookup(
2499
+ (q, items, options) => this.furthest(q, items, n, options),
2500
+ query,
2501
+ { ...opt, sort: 'asc' }
2502
+ );
2503
+ }
2504
+ structuredPairs(data, key, other, otherKey, opt) {
2505
+ return this.structured(data, key).lookupPairs(
2506
+ (items, otherItems, options) => this.pairs(items, otherItems, options),
2507
+ other,
2508
+ otherKey,
2509
+ opt
2510
+ );
2511
+ }
2291
2512
  }
2292
2513
 
2293
2514
  class CmpStrAsync extends CmpStr {
@@ -2404,12 +2625,60 @@
2404
2625
  const { algo: a, opt: o } = this.options.processors?.phonetic ?? {};
2405
2626
  return this.indexAsync(input, { algo: algo ?? a, opt: opt ?? o });
2406
2627
  }
2628
+ async structuredLookupAsync(query, data, key, opt) {
2629
+ return await this.structured(data, key).lookupAsync(
2630
+ (q, items, options) => this.batchTestAsync(q, items, options),
2631
+ query,
2632
+ opt
2633
+ );
2634
+ }
2635
+ async structuredMatchAsync(query, data, key, threshold, opt) {
2636
+ return await this.structured(data, key).lookupAsync(
2637
+ (q, items, options) => this.matchAsync(q, items, threshold, options),
2638
+ query,
2639
+ { ...opt, sort: 'desc' }
2640
+ );
2641
+ }
2642
+ async structuredClosestAsync(query, data, key, n = 1, opt) {
2643
+ return await this.structured(data, key).lookupAsync(
2644
+ (q, items, options) => this.closestAsync(q, items, n, options),
2645
+ query,
2646
+ { ...opt, sort: 'desc' }
2647
+ );
2648
+ }
2649
+ async structuredFurthestAsync(query, data, key, n = 1, opt) {
2650
+ return await this.structured(data, key).lookupAsync(
2651
+ (q, items, options) => this.furthestAsync(q, items, n, options),
2652
+ query,
2653
+ { ...opt, sort: 'asc' }
2654
+ );
2655
+ }
2656
+ async structuredPairsAsync(data, key, other, otherKey, opt) {
2657
+ return await this.structured(data, key).lookupPairsAsync(
2658
+ (items, otherItems, options) =>
2659
+ this.pairsAsync(items, otherItems, options),
2660
+ other,
2661
+ otherKey,
2662
+ opt
2663
+ );
2664
+ }
2407
2665
  }
2408
2666
 
2409
2667
  exports.CmpStr = CmpStr;
2410
2668
  exports.CmpStrAsync = CmpStrAsync;
2669
+ exports.DeepMerge = DeepMerge;
2411
2670
  exports.DiffChecker = DiffChecker;
2671
+ exports.Filter = Filter;
2672
+ exports.HashTable = HashTable;
2673
+ exports.Metric = Metric;
2674
+ exports.MetricRegistry = MetricRegistry;
2412
2675
  exports.Normalizer = Normalizer;
2676
+ exports.Phonetic = Phonetic;
2677
+ exports.PhoneticMappingRegistry = PhoneticMappingRegistry;
2678
+ exports.PhoneticRegistry = PhoneticRegistry;
2679
+ exports.Pool = Pool;
2680
+ exports.Profiler = Profiler;
2681
+ exports.StructuredData = StructuredData;
2413
2682
  exports.TextAnalyzer = TextAnalyzer;
2414
2683
  });
2415
2684
  //# sourceMappingURL=CmpStr.umd.js.map