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