From 0558dfee795c297abef27a3abaa232c73d8a042d Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Wed, 16 Aug 2017 12:26:06 +0900 Subject: [PATCH] Remove count field from ChunkList --- src/chunklist.go | 22 +++++++--------------- src/chunklist_test.go | 7 ++----- src/core.go | 13 ++++++++----- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/chunklist.go b/src/chunklist.go index 599a1ad..510cd73 100644 --- a/src/chunklist.go +++ b/src/chunklist.go @@ -8,14 +8,12 @@ type Chunk struct { count int } -// ItemBuilder is a closure type that builds Item object from a pointer to a -// string and an integer -type ItemBuilder func(*Item, []byte, int) bool +// ItemBuilder is a closure type that builds Item object from byte array +type ItemBuilder func(*Item, []byte) bool // ChunkList is a list of Chunks type ChunkList struct { chunks []*Chunk - count int mutex sync.Mutex trans ItemBuilder } @@ -24,13 +22,12 @@ type ChunkList struct { func NewChunkList(trans ItemBuilder) *ChunkList { return &ChunkList{ chunks: []*Chunk{}, - count: 0, mutex: sync.Mutex{}, trans: trans} } -func (c *Chunk) push(trans ItemBuilder, data []byte, index int) bool { - if trans(&c.items[c.count], data, index) { +func (c *Chunk) push(trans ItemBuilder, data []byte) bool { + if trans(&c.items[c.count], data) { c.count++ return true } @@ -62,13 +59,9 @@ func (cl *ChunkList) Push(data []byte) bool { cl.chunks = append(cl.chunks, &Chunk{}) } - if cl.lastChunk().push(cl.trans, data, cl.count) { - cl.count++ - cl.mutex.Unlock() - return true - } + ret := cl.lastChunk().push(cl.trans, data) cl.mutex.Unlock() - return false + return ret } // Snapshot returns immutable snapshot of the ChunkList @@ -76,7 +69,6 @@ func (cl *ChunkList) Snapshot() ([]*Chunk, int) { cl.mutex.Lock() ret := make([]*Chunk, len(cl.chunks)) - count := cl.count copy(ret, cl.chunks) // Duplicate the last chunk @@ -86,5 +78,5 @@ func (cl *ChunkList) Snapshot() ([]*Chunk, int) { } cl.mutex.Unlock() - return ret, count + return ret, CountItems(ret) } diff --git a/src/chunklist_test.go b/src/chunklist_test.go index c8d33a6..6c1d09e 100644 --- a/src/chunklist_test.go +++ b/src/chunklist_test.go @@ -11,9 +11,8 @@ func TestChunkList(t *testing.T) { // FIXME global sortCriteria = []criterion{byScore, byLength} - cl := NewChunkList(func(item *Item, s []byte, i int) bool { + cl := NewChunkList(func(item *Item, s []byte) bool { item.text = util.ToChars(s) - item.text.Index = int32(i * 2) return true }) @@ -44,9 +43,7 @@ func TestChunkList(t *testing.T) { t.Error("Snapshot should contain only two items") } if chunk1.items[0].text.ToString() != "hello" || - chunk1.items[0].Index() != 0 || - chunk1.items[1].text.ToString() != "world" || - chunk1.items[1].Index() != 2 { + chunk1.items[1].text.ToString() != "world" { t.Error("Invalid data") } if chunk1.IsFull() { diff --git a/src/core.go b/src/core.go index 61f14f9..6bb4b2e 100644 --- a/src/core.go +++ b/src/core.go @@ -83,20 +83,22 @@ func Run(opts *Options, revision string) { // Chunk list var chunkList *ChunkList + var itemIndex int32 header := make([]string, 0, opts.HeaderLines) if len(opts.WithNth) == 0 { - chunkList = NewChunkList(func(item *Item, data []byte, index int) bool { + chunkList = NewChunkList(func(item *Item, data []byte) bool { if len(header) < opts.HeaderLines { header = append(header, string(data)) eventBox.Set(EvtHeader, header) return false } item.text, item.colors = ansiProcessor(data) - item.text.Index = int32(index) + item.text.Index = itemIndex + itemIndex++ return true }) } else { - chunkList = NewChunkList(func(item *Item, data []byte, index int) bool { + chunkList = NewChunkList(func(item *Item, data []byte) bool { tokens := Tokenize(string(data), opts.Delimiter) trans := Transform(tokens, opts.WithNth) transformed := joinTokens(trans) @@ -106,8 +108,9 @@ func Run(opts *Options, revision string) { return false } item.text, item.colors = ansiProcessor([]byte(transformed)) - item.text.Index = int32(index) + item.text.Index = itemIndex item.origText = &data + itemIndex++ return true }) } @@ -153,7 +156,7 @@ func Run(opts *Options, revision string) { reader := NewReader( func(runes []byte) bool { item := Item{} - if chunkList.trans(&item, runes, 0) { + if chunkList.trans(&item, runes) { if result, _, _ := pattern.MatchItem(&item, false, slab); result != nil { opts.Printer(item.text.ToString()) found = true