summaryrefslogtreecommitdiff
path: root/src/matcher.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2024-05-07 01:06:42 +0900
committerGitHub <noreply@github.com>2024-05-07 01:06:42 +0900
commite8405f40fe2eb3675f1cb4f69e825eff5f13f269 (patch)
treec917367f1f0098939f9cdf7376a2a135907024fc /src/matcher.go
parent065b9e6fb2ce3e6e50ff423c3786989afa04ee14 (diff)
downloadfzf-e8405f40fe2eb3675f1cb4f69e825eff5f13f269.tar.gz
Refactor the code so that fzf can be used as a library (#3769)
Diffstat (limited to 'src/matcher.go')
-rw-r--r--src/matcher.go20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/matcher.go b/src/matcher.go
index b9288bb6..26426e4f 100644
--- a/src/matcher.go
+++ b/src/matcher.go
@@ -21,6 +21,7 @@ type MatchRequest struct {
// Matcher is responsible for performing search
type Matcher struct {
+ cache *ChunkCache
patternBuilder func([]rune) *Pattern
sort bool
tac bool
@@ -38,10 +39,11 @@ const (
)
// NewMatcher returns a new Matcher
-func NewMatcher(patternBuilder func([]rune) *Pattern,
+func NewMatcher(cache *ChunkCache, patternBuilder func([]rune) *Pattern,
sort bool, tac bool, eventBox *util.EventBox, revision int) *Matcher {
partitions := util.Min(numPartitionsMultiplier*runtime.NumCPU(), maxPartitions)
return &Matcher{
+ cache: cache,
patternBuilder: patternBuilder,
sort: sort,
tac: tac,
@@ -60,8 +62,13 @@ func (m *Matcher) Loop() {
for {
var request MatchRequest
+ stop := false
m.reqBox.Wait(func(events *util.Events) {
- for _, val := range *events {
+ for t, val := range *events {
+ if t == reqQuit {
+ stop = true
+ return
+ }
switch val := val.(type) {
case MatchRequest:
request = val
@@ -71,12 +78,15 @@ func (m *Matcher) Loop() {
}
events.Clear()
})
+ if stop {
+ break
+ }
if request.sort != m.sort || request.revision != m.revision {
m.sort = request.sort
m.revision = request.revision
m.mergerCache = make(map[string]*Merger)
- clearChunkCache()
+ m.cache.Clear()
}
// Restart search
@@ -236,3 +246,7 @@ func (m *Matcher) Reset(chunks []*Chunk, patternRunes []rune, cancel bool, final
}
m.reqBox.Set(event, MatchRequest{chunks, pattern, final, sort && pattern.sortable, revision})
}
+
+func (m *Matcher) Stop() {
+ m.reqBox.Set(reqQuit, nil)
+}