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