jaroWinkler is more accurate when strings have a common prefix up to a defined maximum length. Adapted from https://github.com/xrash/smetrics/blob/5f08fbb34913bc8ab95bb4f2a89a0637ca922666/jaro-winkler.go.
(a, b string)
| 80 | // |
| 81 | // Adapted from https://github.com/xrash/smetrics/blob/5f08fbb34913bc8ab95bb4f2a89a0637ca922666/jaro-winkler.go. |
| 82 | func jaroWinkler(a, b string) float64 { |
| 83 | const ( |
| 84 | boostThreshold = 0.7 |
| 85 | prefixSize = 4 |
| 86 | ) |
| 87 | jaroDist := jaroDistance(a, b) |
| 88 | if jaroDist <= boostThreshold { |
| 89 | return jaroDist |
| 90 | } |
| 91 | |
| 92 | prefix := int(math.Min(float64(len(a)), math.Min(float64(prefixSize), float64(len(b))))) |
| 93 | |
| 94 | var prefixMatch float64 |
| 95 | for i := range prefix { |
| 96 | if a[i] == b[i] { |
| 97 | prefixMatch++ |
| 98 | } else { |
| 99 | break |
| 100 | } |
| 101 | } |
| 102 | return jaroDist + 0.1*prefixMatch*(1.0-jaroDist) |
| 103 | } |
| 104 | |
| 105 | func suggestFlag(flags []Flag, provided string, hideHelp bool) string { |
| 106 | distance := 0.0 |