From 93bbb3032d1e7550dbabb2d450999cd434c60509 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 4 Jun 2024 15:48:38 +0900 Subject: Add --tail=NUM to limit the number of items to keep in memory --- src/merger.go | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'src/merger.go') 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]} } -- cgit v1.2.3