github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/utils/readline/cache.go (about) 1 package readline 2 3 import "sync" 4 5 //acSuggestions map[string][]string 6 //acDescriptions map[string]map[string]string 7 8 // string 9 10 type cacheString struct { 11 mutex sync.Mutex 12 indexes []string 13 size int 14 values map[string]string 15 } 16 17 func (c *cacheString) Init(rl *Instance) { 18 c.mutex.Lock() 19 20 c.indexes = make([]string, rl.MaxCacheSize) 21 c.size = 0 22 c.values = make(map[string]string) 23 24 c.mutex.Unlock() 25 } 26 27 func (c *cacheString) Append(line []rune, v string) { 28 sLine := string(line) 29 c.mutex.Lock() 30 31 if c.size == len(c.indexes)-1 { 32 delete(c.values, c.indexes[0]) 33 c.indexes = append(c.indexes[1:], "") 34 } else { 35 c.size++ 36 } 37 38 c.indexes[c.size] = sLine 39 c.values[sLine] = v 40 41 c.mutex.Unlock() 42 } 43 44 func (c *cacheString) Get(line []rune) string { 45 sLine := string(line) 46 c.mutex.Lock() 47 48 v := c.values[sLine] 49 50 c.mutex.Unlock() 51 return v 52 } 53 54 // []rune 55 56 type cacheSliceRune struct { 57 mutex sync.Mutex 58 indexes []string 59 size int 60 values map[string][]rune 61 } 62 63 func (c *cacheSliceRune) Init(rl *Instance) { 64 c.mutex.Lock() 65 66 c.indexes = make([]string, rl.MaxCacheSize) 67 c.size = 0 68 c.values = make(map[string][]rune) 69 70 c.mutex.Unlock() 71 } 72 73 func (c *cacheSliceRune) Append(line, v []rune) { 74 sLine := string(line) 75 c.mutex.Lock() 76 77 if c.size == len(c.indexes)-1 { 78 delete(c.values, c.indexes[0]) 79 c.indexes = append(c.indexes[1:], "") 80 } else { 81 c.size++ 82 } 83 84 c.indexes[c.size] = sLine 85 c.values[sLine] = v 86 87 c.mutex.Unlock() 88 } 89 90 func (c *cacheSliceRune) Get(line []rune) []rune { 91 sLine := string(line) 92 c.mutex.Lock() 93 94 v := c.values[sLine] 95 96 c.mutex.Unlock() 97 return v 98 } 99 100 // Slice 101 102 // Map