@@ -264,6 +264,7 @@ function getClosenessRanking(
264264 stringToRank : string ,
265265) : Ranking {
266266 let matchingInOrderCharCount = 0
267+ let charNumber = 0
267268 function findMatchingCharacter (
268269 matchChar : string ,
269270 string : string ,
@@ -278,31 +279,23 @@ function getClosenessRanking(
278279 }
279280 return - 1
280281 }
281- let skipped = 0
282282 function getRanking ( spread : number ) {
283283 const spreadPercentage = 1 / spread
284284 const inOrderPercentage = matchingInOrderCharCount / stringToRank . length
285- const matchPercentage = ( stringToRank . length - skipped ) / stringToRank . length
286- const ranking = rankings . MATCHES + inOrderPercentage * spreadPercentage * matchPercentage
285+ const ranking = rankings . MATCHES + inOrderPercentage * spreadPercentage
287286 return ranking as Ranking
288287 }
289- let firstIndex = 0
290- let charNumber = 0
291- let nextCharNumber = 0
292- for ( let i = 0 , I = stringToRank . length ; i < I ; i ++ ) {
288+ const firstIndex = findMatchingCharacter ( stringToRank [ 0 ] , testString , 0 )
289+ if ( firstIndex < 0 ) {
290+ return rankings . NO_MATCH
291+ }
292+ charNumber = firstIndex
293+ for ( let i = 1 , I = stringToRank . length ; i < I ; i ++ ) {
293294 const matchChar = stringToRank [ i ]
294- nextCharNumber = findMatchingCharacter ( matchChar , testString , charNumber )
295- const found = nextCharNumber > - 1
296- if ( found ) {
297- charNumber = nextCharNumber
298- if ( i === 0 ) {
299- firstIndex = charNumber
300- }
301- } else if ( skipped > 0 || stringToRank . length <= 3 ) {
302- // if search term is short, require finding all characters
295+ charNumber = findMatchingCharacter ( matchChar , testString , charNumber )
296+ const found = charNumber > - 1
297+ if ( ! found ) {
303298 return rankings . NO_MATCH
304- } else {
305- skipped += 1
306299 }
307300 }
308301
0 commit comments