123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- package maps
- // The type makes the underlying map ordered,
- // so every time you pass through all the values
- // they will be in the same order.
- type orderedMap[K comparable, V any] struct {
- store map[K] V
- keys []K
- }
- // Returns the new empty ordered map.
- func NewOrdered[K comparable, V any]() Map[K, V] {
- return &orderedMap[K, V]{
- store: make(map[K] V),
- }
- }
- func (m *orderedMap[K, V]) Clear() {
- m.store = map[K]V{}
- m.keys = []K{}
- }
- func (m *orderedMap[K, V]) Set(k K, v V) {
- _, ok := m.store[k]
- if !ok {
- m.keys = append(m.keys, k)
- }
-
- m.store[k] = v
- }
- func (m *orderedMap[K, V]) Got(key K) (V, bool) {
- v, ok := m.store[key]
- return v, ok
- }
- func (m *orderedMap[K, V]) Has(k K) bool {
- _, ok := m.store[k]
- return ok
- }
- // Get the value from the map.
- func (m *orderedMap[K, V]) Get(k K) (V) {
- v := m.store[k]
- return v
- }
- func (m *orderedMap[K, V]) Del(k K) {
- delete(m.store, k)
- for i, v := range m.keys {
- if v == k {
- m.keys = append(m.keys[:i], m.keys[i+1:]...)
- }
- }
- }
- // Get map keys slice.
- func (m *orderedMap[K, V]) Keys() []K {
- return m.keys
- }
- func (m *orderedMap[K, V]) Values() []V {
- ret := make([]V, len(m.keys))
- i := 0
- for _, k := range m.keys {
- ret[i] = m.store[k]
- i++
- }
- return ret
- }
- func (m *orderedMap[K, V]) KeyChan() chan K {
- chn := make(chan K)
- go func() {
- for _, v := range m.keys {
- chn <- v
- }
- close(chn)
- }()
- return chn
- }
- // Return channel of ordered values.
- func (m *orderedMap[K, V]) Chan() chan V {
- chn := make(chan V)
- go func(){
- for _, k := range m.keys {
- chn <- m.Get(k)
- }
- close(chn)
- }()
-
- return chn
- }
- func (m *orderedMap[K, V]) Empty() bool {
- return len(m.keys) == 0
- }
- func (m *orderedMap[K, V]) Size() int {
- return len(m.keys)
- }
|