diff options
| author | Junegunn Choi <junegunn.c@gmail.com> | 2024-06-04 15:48:38 +0900 |
|---|---|---|
| committer | Junegunn Choi <junegunn.c@gmail.com> | 2024-06-04 17:50:46 +0900 |
| commit | 93bbb3032d1e7550dbabb2d450999cd434c60509 (patch) | |
| tree | f6b4331975184172b256c71335f5964bcddc77df /src/merger.go | |
| parent | 4c83d8596d48acc106ffe62d50a55b3f9608c830 (diff) | |
| download | fzf-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.go | 32 |
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]} } |
