source: imaps-frontend/node_modules/fastest-levenshtein/esm/mod.js@ 79a0317

main
Last change on this file since 79a0317 was 79a0317, checked in by stefan toskovski <stefantoska84@…>, 4 days ago

F4 Finalna Verzija

  • Property mode set to 100644
File size: 3.6 KB
Line 
1const peq = new Uint32Array(0x10000);
2const myers_32 = (a, b) => {
3 const n = a.length;
4 const m = b.length;
5 const lst = 1 << (n - 1);
6 let pv = -1;
7 let mv = 0;
8 let sc = n;
9 let i = n;
10 while (i--) {
11 peq[a.charCodeAt(i)] |= 1 << i;
12 }
13 for (i = 0; i < m; i++) {
14 let eq = peq[b.charCodeAt(i)];
15 const xv = eq | mv;
16 eq |= ((eq & pv) + pv) ^ pv;
17 mv |= ~(eq | pv);
18 pv &= eq;
19 if (mv & lst) {
20 sc++;
21 }
22 if (pv & lst) {
23 sc--;
24 }
25 mv = (mv << 1) | 1;
26 pv = (pv << 1) | ~(xv | mv);
27 mv &= xv;
28 }
29 i = n;
30 while (i--) {
31 peq[a.charCodeAt(i)] = 0;
32 }
33 return sc;
34};
35const myers_x = (b, a) => {
36 const n = a.length;
37 const m = b.length;
38 const mhc = [];
39 const phc = [];
40 const hsize = Math.ceil(n / 32);
41 const vsize = Math.ceil(m / 32);
42 for (let i = 0; i < hsize; i++) {
43 phc[i] = -1;
44 mhc[i] = 0;
45 }
46 let j = 0;
47 for (; j < vsize - 1; j++) {
48 let mv = 0;
49 let pv = -1;
50 const start = j * 32;
51 const vlen = Math.min(32, m) + start;
52 for (let k = start; k < vlen; k++) {
53 peq[b.charCodeAt(k)] |= 1 << k;
54 }
55 for (let i = 0; i < n; i++) {
56 const eq = peq[a.charCodeAt(i)];
57 const pb = (phc[(i / 32) | 0] >>> i) & 1;
58 const mb = (mhc[(i / 32) | 0] >>> i) & 1;
59 const xv = eq | mv;
60 const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
61 let ph = mv | ~(xh | pv);
62 let mh = pv & xh;
63 if ((ph >>> 31) ^ pb) {
64 phc[(i / 32) | 0] ^= 1 << i;
65 }
66 if ((mh >>> 31) ^ mb) {
67 mhc[(i / 32) | 0] ^= 1 << i;
68 }
69 ph = (ph << 1) | pb;
70 mh = (mh << 1) | mb;
71 pv = mh | ~(xv | ph);
72 mv = ph & xv;
73 }
74 for (let k = start; k < vlen; k++) {
75 peq[b.charCodeAt(k)] = 0;
76 }
77 }
78 let mv = 0;
79 let pv = -1;
80 const start = j * 32;
81 const vlen = Math.min(32, m - start) + start;
82 for (let k = start; k < vlen; k++) {
83 peq[b.charCodeAt(k)] |= 1 << k;
84 }
85 let score = m;
86 for (let i = 0; i < n; i++) {
87 const eq = peq[a.charCodeAt(i)];
88 const pb = (phc[(i / 32) | 0] >>> i) & 1;
89 const mb = (mhc[(i / 32) | 0] >>> i) & 1;
90 const xv = eq | mv;
91 const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
92 let ph = mv | ~(xh | pv);
93 let mh = pv & xh;
94 score += (ph >>> (m - 1)) & 1;
95 score -= (mh >>> (m - 1)) & 1;
96 if ((ph >>> 31) ^ pb) {
97 phc[(i / 32) | 0] ^= 1 << i;
98 }
99 if ((mh >>> 31) ^ mb) {
100 mhc[(i / 32) | 0] ^= 1 << i;
101 }
102 ph = (ph << 1) | pb;
103 mh = (mh << 1) | mb;
104 pv = mh | ~(xv | ph);
105 mv = ph & xv;
106 }
107 for (let k = start; k < vlen; k++) {
108 peq[b.charCodeAt(k)] = 0;
109 }
110 return score;
111};
112const distance = (a, b) => {
113 if (a.length < b.length) {
114 const tmp = b;
115 b = a;
116 a = tmp;
117 }
118 if (b.length === 0) {
119 return a.length;
120 }
121 if (a.length <= 32) {
122 return myers_32(a, b);
123 }
124 return myers_x(a, b);
125};
126const closest = (str, arr) => {
127 let min_distance = Infinity;
128 let min_index = 0;
129 for (let i = 0; i < arr.length; i++) {
130 const dist = distance(str, arr[i]);
131 if (dist < min_distance) {
132 min_distance = dist;
133 min_index = i;
134 }
135 }
136 return arr[min_index];
137};
138export { closest, distance };
Note: See TracBrowser for help on using the repository browser.