1
- #[ cfg( feature = "suggestions" ) ]
2
- use std:: cmp:: Ordering ;
3
-
4
1
// Internal
5
2
use crate :: builder:: Command ;
6
3
@@ -13,15 +10,29 @@ where
13
10
T : AsRef < str > ,
14
11
I : IntoIterator < Item = T > ,
15
12
{
16
- let mut candidates: Vec < ( f64 , String ) > = possible_values
17
- . into_iter ( )
13
+ use std:: cmp:: Ordering ;
14
+
15
+ let mut candidates: Vec < ( f64 , String ) > = Vec :: new ( ) ;
16
+ for pv in possible_values {
18
17
// GH #4660: using `jaro` because `jaro_winkler` implementation in `strsim-rs` is wrong
19
18
// causing strings with common prefix >=10 to be considered perfectly similar
20
- . map ( |pv| ( strsim:: jaro ( v, pv. as_ref ( ) ) , pv. as_ref ( ) . to_owned ( ) ) )
21
- // Confidence of 0.7 so that bar -> baz is suggested
22
- . filter ( |( confidence, _) | * confidence > 0.7 )
23
- . collect ( ) ;
24
- candidates. sort_by ( |a, b| a. 0 . partial_cmp ( & b. 0 ) . unwrap_or ( Ordering :: Equal ) ) ;
19
+ let confidence = strsim:: jaro ( v, pv. as_ref ( ) ) ;
20
+
21
+ if confidence > 0.7 {
22
+ let new_elem = ( confidence, pv. as_ref ( ) . to_owned ( ) ) ;
23
+ let pos = candidates
24
+ . binary_search_by ( |probe| {
25
+ if probe. 0 > confidence {
26
+ Ordering :: Greater
27
+ } else {
28
+ Ordering :: Less
29
+ }
30
+ } )
31
+ . unwrap_or_else ( |e| e) ;
32
+ candidates. insert ( pos, new_elem) ;
33
+ }
34
+ }
35
+
25
36
candidates. into_iter ( ) . map ( |( _, pv) | pv) . collect ( )
26
37
}
27
38
0 commit comments