You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					78 lines
				
				1.7 KiB
			
		
		
			
		
	
	
					78 lines
				
				1.7 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								const array = [];
							 | 
						||
| 
								 | 
							
								const charCodeCache = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const leven = (left, right) => {
							 | 
						||
| 
								 | 
							
									if (left === right) {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const swap = left;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Swapping the strings if `a` is longer than `b` so we know which one is the
							 | 
						||
| 
								 | 
							
									// shortest & which one is the longest
							 | 
						||
| 
								 | 
							
									if (left.length > right.length) {
							 | 
						||
| 
								 | 
							
										left = right;
							 | 
						||
| 
								 | 
							
										right = swap;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									let leftLength = left.length;
							 | 
						||
| 
								 | 
							
									let rightLength = right.length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Performing suffix trimming:
							 | 
						||
| 
								 | 
							
									// We can linearly drop suffix common to both strings since they
							 | 
						||
| 
								 | 
							
									// don't increase distance at all
							 | 
						||
| 
								 | 
							
									// Note: `~-` is the bitwise way to perform a `- 1` operation
							 | 
						||
| 
								 | 
							
									while (leftLength > 0 && (left.charCodeAt(~-leftLength) === right.charCodeAt(~-rightLength))) {
							 | 
						||
| 
								 | 
							
										leftLength--;
							 | 
						||
| 
								 | 
							
										rightLength--;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Performing prefix trimming
							 | 
						||
| 
								 | 
							
									// We can linearly drop prefix common to both strings since they
							 | 
						||
| 
								 | 
							
									// don't increase distance at all
							 | 
						||
| 
								 | 
							
									let start = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while (start < leftLength && (left.charCodeAt(start) === right.charCodeAt(start))) {
							 | 
						||
| 
								 | 
							
										start++;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									leftLength -= start;
							 | 
						||
| 
								 | 
							
									rightLength -= start;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (leftLength === 0) {
							 | 
						||
| 
								 | 
							
										return rightLength;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									let bCharCode;
							 | 
						||
| 
								 | 
							
									let result;
							 | 
						||
| 
								 | 
							
									let temp;
							 | 
						||
| 
								 | 
							
									let temp2;
							 | 
						||
| 
								 | 
							
									let i = 0;
							 | 
						||
| 
								 | 
							
									let j = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while (i < leftLength) {
							 | 
						||
| 
								 | 
							
										charCodeCache[i] = left.charCodeAt(start + i);
							 | 
						||
| 
								 | 
							
										array[i] = ++i;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while (j < rightLength) {
							 | 
						||
| 
								 | 
							
										bCharCode = right.charCodeAt(start + j);
							 | 
						||
| 
								 | 
							
										temp = j++;
							 | 
						||
| 
								 | 
							
										result = j;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i = 0; i < leftLength; i++) {
							 | 
						||
| 
								 | 
							
											temp2 = bCharCode === charCodeCache[i] ? temp : temp + 1;
							 | 
						||
| 
								 | 
							
											temp = array[i];
							 | 
						||
| 
								 | 
							
											// eslint-disable-next-line no-multi-assign
							 | 
						||
| 
								 | 
							
											result = array[i] = temp > result ? temp2 > result ? result + 1 : temp2 : temp2 > temp ? temp + 1 : temp2;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return result;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = leven;
							 | 
						||
| 
								 | 
							
								// TODO: Remove this for the next major release
							 | 
						||
| 
								 | 
							
								module.exports.default = leven;
							 |