From 90031fca2587fb62a9104a10ef789d121965a9ed Mon Sep 17 00:00:00 2001 From: Aleksandr Zelenin Date: Mon, 5 Dec 2022 18:47:00 +0300 Subject: [PATCH] - add -withIndents for dataSheets - new ordered map implementation --- structure/map.go | 115 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 structure/map.go diff --git a/structure/map.go b/structure/map.go new file mode 100644 index 0000000..7211481 --- /dev/null +++ b/structure/map.go @@ -0,0 +1,115 @@ +package structure + +import ( + "bytes" + "encoding/json" + "sync" +) + +type OrderedMap[K comparable, V any] struct { + mu sync.Mutex + keys []K + values map[K]V + position int +} + +func NewOrderedMap[K comparable, V any]() *OrderedMap[K, V] { + return &OrderedMap[K, V]{ + keys: []K{}, + values: map[K]V{}, + position: 0, + } +} + +func (orderedMap *OrderedMap[K, V]) Reset() { + orderedMap.mu.Lock() + defer orderedMap.mu.Unlock() + + orderedMap.position = 0 +} + +func (orderedMap *OrderedMap[K, V]) Add(key K, value V) { + orderedMap.mu.Lock() + defer orderedMap.mu.Unlock() + + orderedMap.keys = append(orderedMap.keys, key) + orderedMap.values[key] = value +} + +func (orderedMap *OrderedMap[K, V]) Get(key K) (V, bool) { + orderedMap.mu.Lock() + defer orderedMap.mu.Unlock() + + value, ok := orderedMap.values[key] + + return value, ok +} + +func (orderedMap *OrderedMap[K, V]) GetByPosition(position int) (key K, value V, ok bool) { + orderedMap.mu.Lock() + defer orderedMap.mu.Unlock() + + if len(orderedMap.keys) > position { + key := orderedMap.keys[position] + value := orderedMap.values[key] + + return key, value, true + } + + return +} + +func (orderedMap *OrderedMap[K, V]) Has() bool { + orderedMap.mu.Lock() + defer orderedMap.mu.Unlock() + + return len(orderedMap.keys) > orderedMap.position +} + +func (orderedMap *OrderedMap[K, V]) Next() (K, V) { + orderedMap.mu.Lock() + defer orderedMap.mu.Unlock() + + key := orderedMap.keys[orderedMap.position] + value := orderedMap.values[key] + orderedMap.position++ + + return key, value +} + +func (orderedMap *OrderedMap[K, V]) MarshalJSON() ([]byte, error) { + var data []byte + var err error + var buf bytes.Buffer + + buf.WriteRune('{') + orderedMap.Reset() + var i int + for orderedMap.Has() { + key, value := orderedMap.Next() + + if i > 0 { + buf.WriteRune(',') + } + + data, err = json.Marshal(key) + if err != nil { + return nil, err + } + + buf.Write(data) + buf.WriteRune(':') + + data, err = json.Marshal(value) + if err != nil { + return nil, err + } + + buf.Write(data) + + i++ + } + + buf.WriteRune('}') + return buf.Bytes(), nil +}