Skip to content

Commit

Permalink
- add -withIndents for dataSheets
Browse files Browse the repository at this point in the history
- new ordered map implementation
  • Loading branch information
zelenin committed Dec 5, 2022
1 parent 139cb44 commit 90031fc
Showing 1 changed file with 115 additions and 0 deletions.
115 changes: 115 additions & 0 deletions structure/map.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 90031fc

Please sign in to comment.