github.com/mithrandie/csvq@v1.18.1/lib/query/sync_map.go (about)

     1  package query
     2  
     3  import (
     4  	"sort"
     5  	"sync"
     6  )
     7  
     8  type SyncMap struct {
     9  	m   *sync.Map
    10  	mtx *sync.Mutex
    11  }
    12  
    13  func NewSyncMap() *SyncMap {
    14  	return &SyncMap{
    15  		m:   &sync.Map{},
    16  		mtx: &sync.Mutex{},
    17  	}
    18  }
    19  
    20  func (m SyncMap) store(key string, value interface{}) {
    21  	m.m.Store(key, value)
    22  }
    23  
    24  func (m SyncMap) load(key string) (interface{}, bool) {
    25  	return m.m.Load(key)
    26  }
    27  
    28  func (m SyncMap) delete(key string) {
    29  	m.m.Delete(key)
    30  }
    31  
    32  func (m SyncMap) exists(name string) bool {
    33  	_, ok := m.m.Load(name)
    34  	return ok
    35  }
    36  
    37  func (m SyncMap) lock() {
    38  	m.mtx.Lock()
    39  }
    40  
    41  func (m SyncMap) unlock() {
    42  	m.mtx.Unlock()
    43  }
    44  
    45  func (m SyncMap) Clear() {
    46  	m.lock()
    47  	m.Range(func(key, value interface{}) bool {
    48  		m.m.Delete(key)
    49  		return true
    50  	})
    51  	m.unlock()
    52  }
    53  
    54  func (m SyncMap) Range(fn func(key, value interface{}) bool) {
    55  	m.m.Range(fn)
    56  }
    57  
    58  func (m SyncMap) Keys() []string {
    59  	keys := make([]string, 0, 10)
    60  	m.m.Range(func(key, value interface{}) bool {
    61  		keys = append(keys, key.(string))
    62  		return true
    63  	})
    64  	return keys
    65  }
    66  
    67  func (m SyncMap) Len() int {
    68  	cnt := 0
    69  	m.m.Range(func(key, value interface{}) bool {
    70  		cnt++
    71  		return true
    72  	})
    73  	return cnt
    74  }
    75  
    76  func (m SyncMap) SortedKeys() []string {
    77  	keys := m.Keys()
    78  	sort.Strings(keys)
    79  	return keys
    80  }