IOTConnect-Web/node_modules/commist/leven.js
2024-05-09 09:49:52 +08:00

92 lines
3.0 KiB
JavaScript

/*
* MIT License
*
* Copyright (c) Sindre Sorhus <[email protected]> (https://sindresorhus.com)
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial
* portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
const array = []
const characterCodeCache = []
module.exports = function leven (first, second) {
if (first === second) {
return 0
}
const swap = first
// Swapping the strings if `a` is longer than `b` so we know which one is the
// shortest & which one is the longest
if (first.length > second.length) {
first = second
second = swap
}
let firstLength = first.length
let secondLength = second.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 (firstLength > 0 && (first.charCodeAt(~-firstLength) === second.charCodeAt(~-secondLength))) {
firstLength--
secondLength--
}
// 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 < firstLength && (first.charCodeAt(start) === second.charCodeAt(start))) {
start++
}
firstLength -= start
secondLength -= start
if (firstLength === 0) {
return secondLength
}
let bCharacterCode
let result
let temporary
let temporary2
let index = 0
let index2 = 0
while (index < firstLength) {
characterCodeCache[index] = first.charCodeAt(start + index)
array[index] = ++index
}
while (index2 < secondLength) {
bCharacterCode = second.charCodeAt(start + index2)
temporary = index2++
result = index2
for (index = 0; index < firstLength; index++) {
temporary2 = bCharacterCode === characterCodeCache[index] ? temporary : temporary + 1
temporary = array[index]
// eslint-disable-next-line no-multi-assign
result = array[index] = temporary > result ? (temporary2 > result ? result + 1 : temporary2) : (temporary2 > temporary ? temporary + 1 : temporary2)
}
}
return result
}