about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cache/index.go18
-rw-r--r--cache/types.go23
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]
+}