-
Notifications
You must be signed in to change notification settings - Fork 135
/
CommandPaletteSearch.js
57 lines (45 loc) · 1.56 KB
/
CommandPaletteSearch.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
import { EventEmitter } from 'events'
import Fuse from 'fuse.js'
const TICK_WAIT_MS = 300
const privFuse = Symbol('privFuse')
const privTick = Symbol('privTick')
const privTerm = Symbol('privTerm')
class CommandPaletteSearch extends EventEmitter {
/* **************************************************************************/
// Lifecycle
/* **************************************************************************/
constructor () {
super()
this[privFuse] = null
this[privTerm] = null
this[privTick] = null
}
/* **************************************************************************/
// Properties
/* **************************************************************************/
get hasTickScheduled () { return this[privTick] !== null }
/* **************************************************************************/
// Searching: Public
/* **************************************************************************/
/**
* Runs a search on the next tick
* @param term: the term to search for
*/
asyncSearch (term) {
this[privTerm] = term
if (!this.hasTickScheduled) {
this[privTick] = setTimeout(this._performNextTick, TICK_WAIT_MS)
}
}
/* **************************************************************************/
// Searching: Heavy lifting
/* **************************************************************************/
/**
* Runs the search for the next tick
*/
_performNextTick = () => {
clearTimeout(this[privTick])
this[privTick] = null
}
}
export default CommandPaletteSearch