2021-08-18 18:37:43 +03:00
|
|
|
package utils
|
|
|
|
|
|
|
|
|
|
type InsertionOrderedStringMap struct {
|
|
|
|
|
keys []string `yaml:"-"`
|
2022-02-27 22:28:00 +08:00
|
|
|
values map[string]interface{}
|
2021-08-18 18:37:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewEmptyInsertionOrderedStringMap(size int) *InsertionOrderedStringMap {
|
|
|
|
|
return &InsertionOrderedStringMap{
|
|
|
|
|
keys: make([]string, 0, size),
|
2022-02-27 22:28:00 +08:00
|
|
|
values: make(map[string]interface{}, size),
|
2021-08-18 18:37:43 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-27 22:28:00 +08:00
|
|
|
func NewInsertionOrderedStringMap(stringMap map[string]interface{}) *InsertionOrderedStringMap {
|
2021-08-18 18:37:43 +03:00
|
|
|
result := NewEmptyInsertionOrderedStringMap(len(stringMap))
|
|
|
|
|
|
|
|
|
|
for k, v := range stringMap {
|
|
|
|
|
result.Set(k, v)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-27 22:28:00 +08:00
|
|
|
func (insertionOrderedStringMap *InsertionOrderedStringMap) ForEach(fn func(key string, data interface{})) {
|
2021-08-18 18:37:43 +03:00
|
|
|
for _, key := range insertionOrderedStringMap.keys {
|
|
|
|
|
fn(key, insertionOrderedStringMap.values[key])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-27 22:28:00 +08:00
|
|
|
func (insertionOrderedStringMap *InsertionOrderedStringMap) Set(key string, value interface{}) {
|
2021-08-18 18:37:43 +03:00
|
|
|
_, present := insertionOrderedStringMap.values[key]
|
|
|
|
|
insertionOrderedStringMap.values[key] = value
|
|
|
|
|
if !present {
|
|
|
|
|
insertionOrderedStringMap.keys = append(insertionOrderedStringMap.keys, key)
|
|
|
|
|
}
|
|
|
|
|
}
|