summaryrefslogtreecommitdiffstats
path: root/src/chunklist.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-01-02 04:49:30 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-01-04 00:37:29 +0900
commitf3177305d5572b26f135fc045481358b4eb1bf69 (patch)
treed59fd9587e44e998581a131875bf45e243df6c6e /src/chunklist.go
parent7ba93d9f8351be64b37c65ae04d594ee261d5d26 (diff)
Rewrite fzf in Go
Diffstat (limited to 'src/chunklist.go')
-rw-r--r--src/chunklist.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/chunklist.go b/src/chunklist.go
new file mode 100644
index 00000000..b1f9638d
--- /dev/null
+++ b/src/chunklist.go
@@ -0,0 +1,73 @@
+package fzf
+
+import "sync"
+
+const CHUNK_SIZE int = 100
+
+type Chunk []*Item // >>> []Item
+
+type Transformer func(*string, int) *Item
+
+type ChunkList struct {
+ chunks []*Chunk
+ count int
+ mutex sync.Mutex
+ trans Transformer
+}
+
+func NewChunkList(trans Transformer) *ChunkList {
+ return &ChunkList{
+ chunks: []*Chunk{},
+ count: 0,
+ mutex: sync.Mutex{},
+ trans: trans}
+}
+
+func (c *Chunk) push(trans Transformer, data *string, index int) {
+ *c = append(*c, trans(data, index))
+}
+
+func (c *Chunk) IsFull() bool {
+ return len(*c) == CHUNK_SIZE
+}
+
+func (cl *ChunkList) lastChunk() *Chunk {
+ return cl.chunks[len(cl.chunks)-1]
+}
+
+func CountItems(cs []*Chunk) int {
+ if len(cs) == 0 {
+ return 0
+ }
+ return CHUNK_SIZE*(len(cs)-1) + len(*(cs[len(cs)-1]))
+}
+
+func (cl *ChunkList) Count() int {
+ return cl.count
+}
+
+func (cl *ChunkList) Chunks() []*Chunk {
+ return cl.chunks
+}
+
+func (cl *ChunkList) Push(data string) {
+ cl.mutex.Lock()
+ defer cl.mutex.Unlock()
+
+ if len(cl.chunks) == 0 || cl.lastChunk().IsFull() {
+ newChunk := Chunk(make([]*Item, 0, CHUNK_SIZE))
+ cl.chunks = append(cl.chunks, &newChunk)
+ }
+
+ cl.lastChunk().push(cl.trans, &data, cl.count)
+ cl.count += 1
+}
+
+func (cl *ChunkList) Snapshot() []*Chunk {
+ cl.mutex.Lock()
+ defer cl.mutex.Unlock()
+
+ ret := make([]*Chunk, len(cl.chunks))
+ copy(ret, cl.chunks)
+ return ret
+}