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

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]})
}
}