summaryrefslogtreecommitdiff
path: root/src/merger.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2024-06-04 15:48:38 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2024-06-04 17:50:46 +0900
commit93bbb3032d1e7550dbabb2d450999cd434c60509 (patch)
treef6b4331975184172b256c71335f5964bcddc77df /src/merger.go
parent4c83d8596d48acc106ffe62d50a55b3f9608c830 (diff)
downloadfzf-93bbb3032d1e7550dbabb2d450999cd434c60509.tar.gz
Add --tail=NUM to limit the number of items to keep in memory
Diffstat (limited to 'src/merger.go')
-rw-r--r--src/merger.go32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/merger.go b/src/merger.go
index 6a235043..fee8a59a 100644
--- a/src/merger.go
+++ b/src/merger.go
@@ -3,8 +3,8 @@ package fzf
import "fmt"
// EmptyMerger is a Merger with no data
-func EmptyMerger(revision int) *Merger {
- return NewMerger(nil, [][]Result{}, false, false, revision)
+func EmptyMerger(revision revision) *Merger {
+ return NewMerger(nil, [][]Result{}, false, false, revision, 0)
}
// Merger holds a set of locally sorted lists of items and provides the view of
@@ -20,19 +20,25 @@ type Merger struct {
final bool
count int
pass bool
- revision int
+ revision revision
+ minIndex int32
}
// PassMerger returns a new Merger that simply returns the items in the
// original order
-func PassMerger(chunks *[]*Chunk, tac bool, revision int) *Merger {
+func PassMerger(chunks *[]*Chunk, tac bool, revision revision) *Merger {
+ var minIndex int32
+ if len(*chunks) > 0 {
+ minIndex = (*chunks)[0].items[0].Index()
+ }
mg := Merger{
pattern: nil,
chunks: chunks,
tac: tac,
count: 0,
pass: true,
- revision: revision}
+ revision: revision,
+ minIndex: minIndex}
for _, chunk := range *mg.chunks {
mg.count += chunk.count
@@ -41,7 +47,7 @@ func PassMerger(chunks *[]*Chunk, tac bool, revision int) *Merger {
}
// NewMerger returns a new Merger
-func NewMerger(pattern *Pattern, lists [][]Result, sorted bool, tac bool, revision int) *Merger {
+func NewMerger(pattern *Pattern, lists [][]Result, sorted bool, tac bool, revision revision, minIndex int32) *Merger {
mg := Merger{
pattern: pattern,
lists: lists,
@@ -52,7 +58,8 @@ func NewMerger(pattern *Pattern, lists [][]Result, sorted bool, tac bool, revisi
tac: tac,
final: false,
count: 0,
- revision: revision}
+ revision: revision,
+ minIndex: minIndex}
for _, list := range mg.lists {
mg.count += len(list)
@@ -61,7 +68,7 @@ func NewMerger(pattern *Pattern, lists [][]Result, sorted bool, tac bool, revisi
}
// Revision returns revision number
-func (mg *Merger) Revision() int {
+func (mg *Merger) Revision() revision {
return mg.revision
}
@@ -81,7 +88,7 @@ func (mg *Merger) First() Result {
func (mg *Merger) FindIndex(itemIndex int32) int {
index := -1
if mg.pass {
- index = int(itemIndex)
+ index = int(itemIndex - mg.minIndex)
if mg.tac {
index = mg.count - index - 1
}
@@ -102,6 +109,13 @@ func (mg *Merger) Get(idx int) Result {
if mg.tac {
idx = mg.count - idx - 1
}
+ firstChunk := (*mg.chunks)[0]
+ if firstChunk.count < chunkSize && idx >= firstChunk.count {
+ idx -= firstChunk.count
+
+ chunk := (*mg.chunks)[idx/chunkSize+1]
+ return Result{item: &chunk.items[idx%chunkSize]}
+ }
chunk := (*mg.chunks)[idx/chunkSize]
return Result{item: &chunk.items[idx%chunkSize]}
}