@@ -5,59 +5,61 @@ import (
55	"sync" 
66)
77
8- type  mapElement  struct  {
9- 	key    interface {} 
10- 	value  interface {} 
8+ type  mapElement [ K   comparable ,  V   any ]  struct  {
9+ 	key    K 
10+ 	value  V 
1111}
1212
1313// Map is a thread safe and ordered implementation of standard map. 
14- type  Map  struct  {
15- 	mp   map [interface {}]* list.Element 
14+ // K is the type of key and V is the type of value. 
15+ type  Map [K  comparable , V  any ] struct  {
16+ 	mp   map [K ]* list.Element 
1617	mu   sync.RWMutex 
1718	dll  * list.List 
1819}
1920
20- // New returns an initialized Map. 
21- func  New () * Map  {
22- 	m  :=  new (Map )
23- 	m .mp  =  make (map [interface {} ]* list.Element )
21+ // New returns an initialized Map[K, V] . 
22+ func  New [ K   comparable ,  V   any ] () * Map [ K ,  V ]  {
23+ 	m  :=  new (Map [ K ,  V ] )
24+ 	m .mp  =  make (map [K ]* list.Element )
2425	m .dll  =  list .New ()
2526	return  m 
2627}
2728
28- // Get returns the value stored in the map for a key, or nil if no  
29- // value  is present . 
30- // The ok result  indicates whether value was found in the map. 
31- func  (m  * Map ) Get (key  interface {} ) (interface {} , bool ) {
29+ // Get returns the value stored in the map for a key.  
30+ // If the key  is not found in the Map it return the zero value of type V . 
31+ // The bool  indicates whether value was found in the map. 
32+ func  (m  * Map [ K ,  V ] ) Get (key  K ) (V , bool ) {
3233	m .mu .RLock ()
3334	defer  m .mu .RUnlock ()
3435
3536	v , ok  :=  m .mp [key ]
3637	if  ! ok  {
37- 		return  nil , false 
38+ 		var  value  V 
39+ 		return  value , ok 
3840	}
3941
40- 	me  :=  v .Value .(mapElement )
42+ 	me  :=  v .Value .(mapElement [ K ,  V ] )
4143	return  me .value , ok 
4244}
4345
4446// Put sets the value for the given key. 
4547// It will replace the value if the key already exists in the map 
4648// even if the values are same. 
47- func  (m  * Map ) Put (key  interface {} , val  interface {} ) {
49+ func  (m  * Map [ K ,  V ] ) Put (key  K , val  V ) {
4850	m .mu .Lock ()
4951	defer  m .mu .Unlock ()
5052
5153	if  e , ok  :=  m .mp [key ]; ! ok  {
52- 		m .mp [key ] =  m .dll .PushFront (mapElement {key : key , value : val })
54+ 		m .mp [key ] =  m .dll .PushFront (mapElement [ K ,  V ] {key : key , value : val })
5355	} else  {
54- 		e .Value  =  mapElement {key : key , value : val }
56+ 		e .Value  =  mapElement [ K ,  V ] {key : key , value : val }
5557	}
5658}
5759
5860// Delete deletes the value for a key. 
5961// It returns a boolean indicating weather the key existed and it was deleted. 
60- func  (m  * Map ) Delete (key  interface {} ) bool  {
62+ func  (m  * Map [ K ,  V ] ) Delete (key  K ) bool  {
6163	m .mu .Lock ()
6264	defer  m .mu .Unlock ()
6365
@@ -75,35 +77,32 @@ func (m *Map) Delete(key interface{}) bool {
7577// This is same as ranging over a map using the "for range" syntax. 
7678// Parameter func f should not call any method of the Map, eg Get, Put, Delete, UnorderedRange, OrderedRange etc 
7779// It will cause a deadlock. 
78- func  (m  * Map ) UnorderedRange (f  func (key  interface {} , value  interface {} )) {
80+ func  (m  * Map [ K ,  V ] ) UnorderedRange (f  func (key  K , value  V )) {
7981	m .mu .RLock ()
8082	defer  m .mu .RUnlock ()
8183
8284	for  k , v  :=  range  m .mp  {
83- 		f (k , v .Value .(mapElement ).value )
85+ 		f (k , v .Value .(mapElement [ K ,  V ] ).value )
8486	}
8587}
8688
8789// OrderedRange will range over the map in ab ordered sequence. 
88- // This is way faster than UnorderedRange. For a map containing 10_000_000 items 
89- // UnorderedRange completes in ~1.7 seconds, 
90- // OrderedRange completes in ~98 milli seconds. 
9190// Parameter func f should not call any method of the Map, eg Get, Put, Delete, UnorderedRange, OrderedRange etc 
9291// It will cause a deadlock. 
93- func  (m  * Map ) OrderedRange (f  func (key  interface {} , value  interface {} )) {
92+ func  (m  * Map [ K ,  V ] ) OrderedRange (f  func (key  K , value  V )) {
9493	m .mu .RLock ()
9594	defer  m .mu .RUnlock ()
9695
9796	cur  :=  m .dll .Back ()
9897	for  cur  !=  nil  {
99- 		me  :=  cur .Value .(mapElement )
98+ 		me  :=  cur .Value .(mapElement [ K ,  V ] )
10099		f (me .key , me .value )
101100		cur  =  cur .Prev ()
102101	}
103102}
104103
105104// Length will return the length of Map. 
106- func  (m  * Map ) Length () int  {
105+ func  (m  * Map [ k ,  V ] ) Length () int  {
107106	m .mu .RLock ()
108107	defer  m .mu .RUnlock ()
109108
@@ -114,31 +113,33 @@ func (m *Map) Length() int {
114113// If the key did not exist previously it will be added to the Map. 
115114// updated will be true if the key existed previously 
116115// otherwise it will be false if the key did not exist and was added to the Map. 
117- func  (m  * Map ) GetOrPut (key  interface {} , value  interface {} ) (finalValue   interface {},  updated  bool ) {
116+ func  (m  * Map [ K ,  V ] ) GetOrPut (key  K , value  V ) (V ,  bool ) {
118117	m .mu .Lock ()
119118	defer  m .mu .Unlock ()
120119
121120	if  e , exists  :=  m .mp [key ]; exists  {
122- 		e . Value   =   mapElement { key :  key ,  value :  value } 
123- 		return  value , true 
121+ 		me   :=   e . Value .( mapElement [ K ,  V ]) 
122+ 		return  me . value , true 
124123	} else  {
125- 		m .mp [key ] =  m .dll .PushFront (mapElement {key : key , value : value })
124+ 		m .mp [key ] =  m .dll .PushFront (mapElement [ K ,  V ] {key : key , value : value })
126125		return  value , false 
127126	}
128127}
129128
130129// GetAndDelete will get the value saved against the given key. 
131130// deleted will be true if the key existed previously 
132131// otherwise it will be false. 
133- func  (m  * Map ) GetAndDelete (key  interface {} ) (value   interface {},  deleted  bool ) {
132+ func  (m  * Map [ K ,  V ] ) GetAndDelete (key  K ) (V ,  bool ) {
134133	m .mu .Lock ()
135134	defer  m .mu .Unlock ()
136135
137136	if  e , exists  :=  m .mp [key ]; exists  {
138137		m .dll .Remove (e )
139138		delete (m .mp , key )
140- 		return  e .Value , true 
139+ 		me  :=  e .Value .(mapElement [K , V ])
140+ 		return  me .value , true 
141141	} else  {
142- 		return  nil , false 
142+ 		var  value  V 
143+ 		return  value , false 
143144	}
144145}
0 commit comments