diff options
| author | Jonas Knobloch <jonas.knobloch@t-online.de> | 2026-09-09 02:40:41 +0200 |
|---|---|---|
| committer | Jonas Knobloch <jonas.knobloch@t-online.de> | 2026-09-09 02:40:41 +0200 |
| commit | 8fd3f8aeec85f47d43ef36a81456d48640ca33f9 (patch) | |
| tree | 3c42c767dba661dfa28275379de35145f71611d8 /dict/dict.go | |
| parent | 08400210cfdfd5769ce2d48db5234fbeae2e0c6e (diff) | |
Add dict module
Diffstat (limited to 'dict/dict.go')
| -rw-r--r-- | dict/dict.go | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/dict/dict.go b/dict/dict.go new file mode 100644 index 0000000..bc0f8bd --- /dev/null +++ b/dict/dict.go @@ -0,0 +1,85 @@ +package dict + +import ( + "iter" + "slices" +) + +type Entry[V any] struct { + Key string + Val V +} +type Dict[V any] struct { + s []Entry[V] + m map[string]int +} + +func NewDict[V any]() *Dict[V] { + return &Dict[V]{ + s: make([]Entry[V], 0), + m: make(map[string]int), + } +} + +func (d *Dict[V]) Set(key string, val V) { + if i, ok := d.m[key]; ok { + d.s[i].Val = val + + return + } + + d.s = append(d.s, Entry[V]{ + Key: key, + Val: val, + }) + + d.m[key] = len(d.s) - 1 +} + +func (d *Dict[V]) Get(key string) (V, bool) { + i, ok := d.m[key] + + if !ok { + var zero V + + return zero, false + } + + return d.s[i].Val, true +} + +func (d *Dict[V]) GetBytes(key []byte) (V, bool) { + if i, ok := d.m[string(key)]; ok { + return d.s[i].Val, true + } + + var zero V + + return zero, false +} + +func (d *Dict[V]) Values() iter.Seq2[int, V] { + return func(yield func(int, V) bool) { + for i, entry := range d.s { + if !yield(i, entry.Val) { + return + } + } + } +} + +func (d *Dict[V]) Sort(cmp func(a, b Entry[V]) int) { + slices.SortFunc(d.s, cmp) + + for i, entry := range d.s { + d.m[entry.Key] = i + } +} + +// func CmpKey[V any](a, b Entry[V]) int { +// return strings.Compare(a.Key, b.Key) +// } + +// func CmpVal[V cmp.Ordered](a, b Entry[V]) int { +// return cmp.Compare(a.Val, b.Val) +// } |
