New minor release after complete rewrite.

Brings neat and testable codebase with minimum allocations in mind.
This commit is contained in:
2023-04-07 15:27:44 +01:00
parent 6a8f99f6ef
commit e0913f8824
26 changed files with 1417 additions and 1129 deletions
+64
View File
@@ -0,0 +1,64 @@
package ordered_map
import (
"bytes"
jsoniter "github.com/json-iterator/go"
)
var json = jsoniter.ConfigCompatibleWithStandardLibrary
type OrderedMap struct {
values map[string]interface{}
keys []string
}
func New() *OrderedMap {
o := OrderedMap{}
o.keys = []string{}
o.values = map[string]interface{}{}
return &o
}
func (o *OrderedMap) Set(key string, value interface{}) {
_, exists := o.values[key]
if !exists {
o.keys = append(o.keys, key)
}
o.values[key] = value
}
func (o OrderedMap) MarshalJSON() ([]byte, error) {
var buf bytes.Buffer
buf.WriteByte('{')
encoder := json.NewEncoder(&buf)
encoder.SetEscapeHTML(false)
encoder.SetIndent("", "")
for i, k := range o.keys {
if i > 0 {
buf.WriteByte(',')
}
buf.WriteByte('"')
buf.WriteString(k)
buf.WriteString(`":`)
customEncoder := &customJsonEncoder{buf: &buf}
if err := customEncoder.Encode(o.values[k]); err != nil {
return nil, err
}
}
buf.WriteByte('}')
return buf.Bytes(), nil
}
type customJsonEncoder struct {
buf *bytes.Buffer
}
func (e *customJsonEncoder) Encode(v interface{}) error {
data, err := json.Marshal(v)
if err != nil {
return err
}
e.buf.Write(data)
return nil
}