Guest User

Untitled

a guest
Jan 22nd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.95 KB | None | 0 0
  1. package syncmap
  2.  
  3. type SyncMap struct {
  4. ops chan func(map[string]interface{})
  5. m map[string]interface{}
  6. }
  7.  
  8. func (sm *SyncMap) loop() chan func(map[string]interface{}) {
  9. ops := make(chan func(map[string]interface{}))
  10. if sm.m == nil {
  11. sm.m = make(map[string]interface{})
  12. }
  13.  
  14. go func() {
  15. for op := range ops {
  16. op(sm.m)
  17. }
  18. }()
  19.  
  20. return ops
  21. }
  22.  
  23. func (sm *SyncMap) Do(op func(map[string]interface{})) {
  24. if sm.ops == nil {
  25. sm.ops = sm.loop()
  26. }
  27. sm.ops <- op
  28. }
  29.  
  30. func New() *SyncMap {
  31. sm := new(SyncMap)
  32. sm.ops = sm.loop()
  33. sm.m = make(map[string]interface{})
  34. return sm
  35. }
  36.  
  37. func (sm *SyncMap) Add(key string, value interface{}) {
  38. sm.Do(func(m map[string]interface{}) {
  39. m[key] = value
  40. })
  41. }
  42.  
  43. func (sm *SyncMap) Del(key string) {
  44. sm.Do(func(m map[string]interface{}) {
  45. delete(m, key)
  46. })
  47. }
  48.  
  49. func (sm *SyncMap) Get(key string) interface{} {
  50. result := make(chan interface{})
  51. sm.Do(func(m map[string]interface{}) {
  52. result <- m[key]
  53. })
  54. return <-result
  55. }
Add Comment
Please, Sign In to add comment