forked from elliotchance/orderedmap
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathorderedmap.go
122 lines (99 loc) · 2.86 KB
/
orderedmap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package orderedmap
import "container/list"
type orderedMapElement struct {
key, value interface{}
}
type OrderedMap struct {
kv map[interface{}]*list.Element
ll *list.List
}
func NewOrderedMap() *OrderedMap {
return &OrderedMap{
kv: make(map[interface{}]*list.Element),
ll: list.New(),
}
}
// Get returns the value for a key. If the key does not exist, the second return
// parameter will be false and the value will be nil.
func (m *OrderedMap) Get(key interface{}) (interface{}, bool) {
value, ok := m.kv[key]
if ok {
return value.Value.(*orderedMapElement).value, true
}
return nil, false
}
// Set will set (or replace) a value for a key. If the key was new, then true
// will be returned. The returned value will be false if the value was replaced
// (even if the value was the same).
func (m *OrderedMap) Set(key, value interface{}) bool {
_, didExist := m.kv[key]
if !didExist {
element := m.ll.PushBack(&orderedMapElement{key, value})
m.kv[key] = element
} else {
m.kv[key].Value.(*orderedMapElement).value = value
}
return !didExist
}
// GetOrDefault returns the value for a key. If the key does not exist, returns
// the default value instead.
func (m *OrderedMap) GetOrDefault(key, defaultValue interface{}) interface{} {
if value, ok := m.kv[key]; ok {
return value.Value.(*orderedMapElement).value
}
return defaultValue
}
// Len returns the number of elements in the map.
func (m *OrderedMap) Len() int {
return len(m.kv)
}
// Keys returns all of the keys in the order they were inserted. If a key was
// replaced it will retain the same position. To ensure most recently set keys
// are always at the end you must always Delete before Set.
func (m *OrderedMap) Keys() (keys []interface{}) {
keys = make([]interface{}, m.Len())
element := m.ll.Front()
for i := 0; element != nil; i++ {
keys[i] = element.Value.(*orderedMapElement).key
element = element.Next()
}
return keys
}
// Delete will remove a key from the map. It will return true if the key was
// removed (the key did exist).
func (m *OrderedMap) Delete(key interface{}) (didDelete bool) {
element, ok := m.kv[key]
if ok {
m.ll.Remove(element)
delete(m.kv, key)
}
return ok
}
// Front will return the element that is the first (oldest Set element). If
// there are no elements this will return nil.
func (m *OrderedMap) Front() *Element {
front := m.ll.Front()
if front == nil {
return nil
}
element := front.Value.(*orderedMapElement)
return &Element{
element: front,
Key: element.key,
Value: element.value,
}
}
// Back will return the element that is the last (most recent Set element). If
// there are no elements this will return nil.
func (m *OrderedMap) Back() *Element {
back := m.ll.Back()
if back == nil {
return nil
}
element := back.Value.(*orderedMapElement)
return &Element{
element: back,
Key: element.key,
Value: element.value,
}
}