-
Notifications
You must be signed in to change notification settings - Fork 1
/
compareFunctions.js
61 lines (54 loc) · 1.74 KB
/
compareFunctions.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import R from 'ramda'
import * as difflib from 'difflib'
export function getClosestMatchIndex (searchTerm, possibilities) {
let matcher = new difflib.SequenceMatcher()
matcher.setSeq2(searchTerm)
let cutoff = 0.6
let results = []
// check identity match first, ratio compution takes time
let identityMatchIndex = possibilities.findIndex(text => text === searchTerm)
if (identityMatchIndex >= 0) {
return identityMatchIndex
}
// search for close match
possibilities.forEach(function (testText, i) {
matcher.setSeq1(testText)
if (matcher.realQuickRatio() >= cutoff &&
matcher.quickRatio() >= cutoff) {
let score = matcher.ratio()
if (score >= cutoff) {
results.push({
text: testText,
index: i,
score: score
})
}
}
})
if (results.length <= 0) {
console.debug('--- no match found', {
searchTerm,
possibilities
})
// nothing found
return -1
}
// sortBy prop ascending and reverse to have descending sorted results by score
let sorted = R.sortBy(R.prop('score'), results).reverse()
let bestMatch = R.head(sorted)
console.debug('--- match found', {
searchTerm,
score: bestMatch.score,
sorted
})
return bestMatch.index
}
export function getFunctionIndexByText (searchTerm, functions) {
return getClosestMatchIndex(searchTerm, functions.map(f => f.text))
}
export function getFunctionByText (searchTerm, functions) {
let index = getClosestMatchIndex(searchTerm, functions.map(f => f.text))
if (index >= 0) {
return functions[index]
}
}