Make Set private.

This commit is contained in:
Andrey Petrov 2015-01-20 16:39:07 -08:00
parent c2adb4d632
commit bb1d568b38
5 changed files with 33 additions and 33 deletions

View File

@ -54,7 +54,7 @@ func TestTheme(t *testing.T) {
t.Errorf("Got: `%s`; Expected: `%s`", actual, expected) t.Errorf("Got: `%s`; Expected: `%s`", actual, expected)
} }
u := NewUser(testId("foo")) u := NewUser(SimpleId("foo"))
u.colorIdx = 4 u.colorIdx = 4
actual = colorTheme.ColorName(u) actual = colorTheme.ColorName(u)
expected = "\033[38;05;4mfoo\033[0m" expected = "\033[38;05;4mfoo\033[0m"

View File

@ -9,12 +9,12 @@ func TestMakeUser(t *testing.T) {
var actual, expected []byte var actual, expected []byte
s := &MockScreen{} s := &MockScreen{}
u := NewUser(testId("foo")) u := NewUser(SimpleId("foo"))
m := NewAnnounceMsg("hello") m := NewAnnounceMsg("hello")
defer u.Close() defer u.Close()
u.Send(m) u.Send(m)
u.ConsumeOne(s) u.HandleMsg(<-u.ConsumeChan(), s)
s.Read(&actual) s.Read(&actual)
expected = []byte(m.String() + Newline) expected = []byte(m.String() + Newline)

View File

@ -30,7 +30,7 @@ type Member struct {
type Room struct { type Room struct {
topic string topic string
history *message.History history *message.History
members *Set members *idSet
broadcast chan message.Message broadcast chan message.Message
commands Commands commands Commands
closed bool closed bool
@ -44,7 +44,7 @@ func NewRoom() *Room {
return &Room{ return &Room{
broadcast: broadcast, broadcast: broadcast,
history: message.NewHistory(historyLen), history: message.NewHistory(historyLen),
members: NewSet(), members: newIdSet(),
commands: *defaultCommands, commands: *defaultCommands,
} }
} }
@ -58,7 +58,7 @@ func (r *Room) SetCommands(commands Commands) {
func (r *Room) Close() { func (r *Room) Close() {
r.closeOnce.Do(func() { r.closeOnce.Do(func() {
r.closed = true r.closed = true
r.members.Each(func(m Item) { r.members.Each(func(m identified) {
m.(*Member).Close() m.(*Member).Close()
}) })
r.members.Clear() r.members.Clear()
@ -92,7 +92,7 @@ func (r *Room) HandleMsg(m message.Message) {
} }
r.history.Add(m) r.history.Add(m)
r.members.Each(func(u Item) { r.members.Each(func(u identified) {
user := u.(*Member).User user := u.(*Member).User
if skip && skipUser == user { if skip && skipUser == user {
// Skip // Skip

View File

@ -10,43 +10,43 @@ import (
var ErrIdTaken = errors.New("id already taken") var ErrIdTaken = errors.New("id already taken")
// The error returned when a requested item does not exist in the set. // The error returned when a requested item does not exist in the set.
var ErrItemMissing = errors.New("item does not exist") var ErridentifiedMissing = errors.New("item does not exist")
// Interface for an item storeable in the set // Interface for an item storeable in the set
type Item interface { type identified interface {
Id() string Id() string
} }
// Set with string lookup. // Set with string lookup.
// TODO: Add trie for efficient prefix lookup? // TODO: Add trie for efficient prefix lookup?
type Set struct { type idSet struct {
lookup map[string]Item lookup map[string]identified
sync.RWMutex sync.RWMutex
} }
// NewSet creates a new set. // newIdSet creates a new set.
func NewSet() *Set { func newIdSet() *idSet {
return &Set{ return &idSet{
lookup: map[string]Item{}, lookup: map[string]identified{},
} }
} }
// Clear removes all items and returns the number removed. // Clear removes all items and returns the number removed.
func (s *Set) Clear() int { func (s *idSet) Clear() int {
s.Lock() s.Lock()
n := len(s.lookup) n := len(s.lookup)
s.lookup = map[string]Item{} s.lookup = map[string]identified{}
s.Unlock() s.Unlock()
return n return n
} }
// Len returns the size of the set right now. // Len returns the size of the set right now.
func (s *Set) Len() int { func (s *idSet) Len() int {
return len(s.lookup) return len(s.lookup)
} }
// In checks if an item exists in this set. // In checks if an item exists in this set.
func (s *Set) In(item Item) bool { func (s *idSet) In(item identified) bool {
s.RLock() s.RLock()
_, ok := s.lookup[item.Id()] _, ok := s.lookup[item.Id()]
s.RUnlock() s.RUnlock()
@ -54,20 +54,20 @@ func (s *Set) In(item Item) bool {
} }
// Get returns an item with the given Id. // Get returns an item with the given Id.
func (s *Set) Get(id string) (Item, error) { func (s *idSet) Get(id string) (identified, error) {
s.RLock() s.RLock()
item, ok := s.lookup[id] item, ok := s.lookup[id]
s.RUnlock() s.RUnlock()
if !ok { if !ok {
return nil, ErrItemMissing return nil, ErridentifiedMissing
} }
return item, nil return item, nil
} }
// Add item to this set if it does not exist already. // Add item to this set if it does not exist already.
func (s *Set) Add(item Item) error { func (s *idSet) Add(item identified) error {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
@ -81,21 +81,21 @@ func (s *Set) Add(item Item) error {
} }
// Remove item from this set. // Remove item from this set.
func (s *Set) Remove(item Item) error { func (s *idSet) Remove(item identified) error {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
id := item.Id() id := item.Id()
_, found := s.lookup[id] _, found := s.lookup[id]
if !found { if !found {
return ErrItemMissing return ErridentifiedMissing
} }
delete(s.lookup, id) delete(s.lookup, id)
return nil return nil
} }
// Replace item from old id with new Item. // Replace item from old id with new identified.
// Used for moving the same Item to a new Id, such as a rename. // Used for moving the same identified to a new Id, such as a rename.
func (s *Set) Replace(oldId string, item Item) error { func (s *idSet) Replace(oldId string, item identified) error {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
@ -108,11 +108,11 @@ func (s *Set) Replace(oldId string, item Item) error {
// Remove oldId // Remove oldId
_, found = s.lookup[oldId] _, found = s.lookup[oldId]
if !found { if !found {
return ErrItemMissing return ErridentifiedMissing
} }
delete(s.lookup, oldId) delete(s.lookup, oldId)
// Add new Item // Add new identified
s.lookup[item.Id()] = item s.lookup[item.Id()] = item
return nil return nil
@ -120,7 +120,7 @@ func (s *Set) Replace(oldId string, item Item) error {
// Each loops over every item while holding a read lock and applies fn to each // Each loops over every item while holding a read lock and applies fn to each
// element. // element.
func (s *Set) Each(fn func(item Item)) { func (s *idSet) Each(fn func(item identified)) {
s.RLock() s.RLock()
for _, item := range s.lookup { for _, item := range s.lookup {
fn(item) fn(item)
@ -129,8 +129,8 @@ func (s *Set) Each(fn func(item Item)) {
} }
// ListPrefix returns a list of items with a prefix, case insensitive. // ListPrefix returns a list of items with a prefix, case insensitive.
func (s *Set) ListPrefix(prefix string) []Item { func (s *idSet) ListPrefix(prefix string) []identified {
r := []Item{} r := []identified{}
prefix = strings.ToLower(prefix) prefix = strings.ToLower(prefix)
s.RLock() s.RLock()

View File

@ -8,7 +8,7 @@ import (
func TestSet(t *testing.T) { func TestSet(t *testing.T) {
var err error var err error
s := NewSet() s := newIdSet()
u := message.NewUser(message.SimpleId("foo")) u := message.NewUser(message.SimpleId("foo"))
if s.In(u) { if s.In(u) {