You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.0 KiB
Go
60 lines
1.0 KiB
Go
package chat
|
|
|
|
type List struct {
|
|
root *ListNode
|
|
length int
|
|
maxLength int
|
|
}
|
|
|
|
type ListNode struct {
|
|
next *ListNode
|
|
data Message
|
|
}
|
|
|
|
func newList(maxLength int) List {
|
|
return List{nil, 0, maxLength}
|
|
}
|
|
|
|
func (l *List) add(node *ListNode) {
|
|
if l.root == nil {
|
|
l.root = node
|
|
} else {
|
|
var n *ListNode
|
|
for n = l.root; n.next != nil; n = n.next {
|
|
}
|
|
n.next = node
|
|
l.length++
|
|
}
|
|
if l.length >= l.maxLength {
|
|
l.trimFirst()
|
|
l.length = l.maxLength
|
|
}
|
|
}
|
|
|
|
func (l *List) trimFirst() {
|
|
l.root = l.root.next
|
|
}
|
|
|
|
func (l *List) toMessageSlice(offset, count int) (messages []Message) {
|
|
messages = make([]Message, 0)
|
|
if l.root == nil {
|
|
return
|
|
}
|
|
for node, i := l.root, 0; node != nil; node, i = node.next, i+1 {
|
|
if i < offset {
|
|
continue
|
|
}
|
|
if i-offset >= count {
|
|
break
|
|
}
|
|
messages = append(messages, node.data)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (l *List) fromMessageSlice(messages []Message) {
|
|
for i := len(messages) - 1; i >= 0; i-- { // expected order is in reverse i.e. latest first
|
|
l.add(&ListNode{nil, messages[i]})
|
|
}
|
|
}
|