diff options
-rw-r--r-- | cache/index.go | 18 | ||||
-rw-r--r-- | cache/types.go | 23 |
2 files changed, 36 insertions, 5 deletions
diff --git a/cache/index.go b/cache/index.go index 0cf8065..ee00479 100644 --- a/cache/index.go +++ b/cache/index.go @@ -2,6 +2,7 @@ package cache import ( "log" + "sort" "strings" "time" ) @@ -11,7 +12,8 @@ func NewUserIndex() *UserIndex { return &UserIndex{} } -// AddUser inserts a new user into the index. The *Data struct only contains the nickname.) +// AddUser inserts a new user into the index. The *Data struct +// contains the nickname and the time the user was added. func (index UserIndex) AddUser(nick string, url string) { rfc3339date, err := time.Now().MarshalText() if err != nil { @@ -29,15 +31,23 @@ func (index UserIndex) DelUser(url string) { imutex.Unlock() } +// QueryUser checks the user index for nicknames that contain the +// nickname provided as an argument. Entries are returned sorted +// by the date they were added to the index. func (index UserIndex) QueryUser(name string) []string { + var timekey = map[time.Time]string{} + var sortedkeys TimeSlice var users []string - var entry string for k, v := range index { if strings.Contains(v.nick, name) { - entry = v.nick + "\t" + k + "\t" + string(v.apidate) - users = append(users, entry) + timekey[v.date] = v.nick + "\t" + k + "\t" + string(v.apidate) + sortedkeys = append(sortedkeys, v.date) } } + sort.Sort(sortedkeys) + for _, e := range sortedkeys { + users = append(users, timekey[e]) + } return users } diff --git a/cache/types.go b/cache/types.go index ed270c3..939114e 100644 --- a/cache/types.go +++ b/cache/types.go @@ -22,5 +22,26 @@ type Data struct { status []string } -// Mutex to control access to the User Index +// Mutex to control access to the User Index. var imutex = sync.RWMutex{} + +// TimeSlice is used for sorting by timestamp. +type TimeSlice []time.Time + +// Len returns the length of the slice to be sorted. +// This helps satisfy sort.Interface with respect to TimeSlice. +func (t TimeSlice) Len() int { + return len(t) +} + +// Less returns true if the timestamp at index i is before the timestamp at index j in TimeSlice. +// This helps satisfy sort.Interface with respect to TimeSlice. +func (t TimeSlice) Less(i, j int) bool { + return t[i].Before(t[j]) +} + +// Swap transposes the timestampss at the two given indices. +// This helps satisfy sort.Interface with respect to TimeSlice. +func (t TimeSlice) Swap(i, j int) { + t[i], t[j] = t[j], t[i] +} |