Dragon-Knight/internal/helpers/ordered_map.go

37 lines
691 B
Go

package helpers
type OrderedMap[K comparable, V any] struct {
keys []K
data map[K]V
}
func NewOrderedMap[K comparable, V any]() *OrderedMap[K, V] {
return &OrderedMap[K, V]{
keys: make([]K, 0),
data: make(map[K]V),
}
}
func (om *OrderedMap[K, V]) Set(key K, value V) {
if _, exists := om.data[key]; !exists {
om.keys = append(om.keys, key)
}
om.data[key] = value
}
func (om *OrderedMap[K, V]) Range(fn func(K, V) bool) {
for _, key := range om.keys {
if !fn(key, om.data[key]) {
break
}
}
}
func (om *OrderedMap[K, V]) ToSlice() []V {
result := make([]V, 0, len(om.keys))
for _, key := range om.keys {
result = append(result, om.data[key])
}
return result
}