-
Notifications
You must be signed in to change notification settings - Fork 8
/
buddy_list_store.go
77 lines (64 loc) · 2.14 KB
/
buddy_list_store.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
package state
import "sync"
// AdjListBuddyListStore implements a buddy list using an adjacency list.
type AdjListBuddyListStore struct {
buddies map[string]map[string]bool
mu sync.RWMutex // ensures thread-safe access
}
// NewAdjListBuddyListStore initializes a new instance of AdjListBuddyListStore.
func NewAdjListBuddyListStore() *AdjListBuddyListStore {
return &AdjListBuddyListStore{
buddies: make(map[string]map[string]bool),
}
}
// AddBuddy adds buddyScreenName to userScreenName's buddy list.
func (store *AdjListBuddyListStore) AddBuddy(userScreenName, buddyScreenName string) {
store.mu.Lock()
defer store.mu.Unlock()
if _, exists := store.buddies[userScreenName]; !exists {
store.buddies[userScreenName] = make(map[string]bool)
}
store.buddies[userScreenName][buddyScreenName] = true
}
// WhoAddedUser returns a list of screen names who have userScreenName in their buddy lists.
func (store *AdjListBuddyListStore) WhoAddedUser(userScreenName string) []string {
store.mu.RLock()
defer store.mu.RUnlock()
var users []string
for user, buddies := range store.buddies {
if buddies[userScreenName] {
users = append(users, user)
}
}
return users
}
// Buddies returns a list of all buddies associated with the specified userScreenName.
func (store *AdjListBuddyListStore) Buddies(userScreenName string) []string {
store.mu.RLock()
defer store.mu.RUnlock()
if buddies, exists := store.buddies[userScreenName]; exists {
users := make([]string, 0, len(buddies))
for buddy := range buddies {
users = append(users, buddy)
}
return users
}
return nil
}
// DeleteBuddy removes buddyScreenName from userScreenName's buddy list.
func (store *AdjListBuddyListStore) DeleteBuddy(userScreenName, buddyScreenName string) {
store.mu.Lock()
defer store.mu.Unlock()
if buddies, exists := store.buddies[userScreenName]; exists {
delete(buddies, buddyScreenName)
if len(buddies) == 0 {
delete(store.buddies, userScreenName)
}
}
}
// DeleteUser removes userScreenName's buddy list.
func (store *AdjListBuddyListStore) DeleteUser(userScreenName string) {
store.mu.Lock()
defer store.mu.Unlock()
delete(store.buddies, userScreenName)
}