46 lines
620 B
Go
46 lines
620 B
Go
package ccache
|
|
|
|
type List[T any] struct {
|
|
Head *Item[T]
|
|
Tail *Item[T]
|
|
}
|
|
|
|
func NewList[T any]() *List[T] {
|
|
return &List[T]{}
|
|
}
|
|
|
|
func (l *List[T]) Remove(item *Item[T]) {
|
|
next := item.next
|
|
prev := item.prev
|
|
|
|
if next == nil {
|
|
l.Tail = prev
|
|
} else {
|
|
next.prev = prev
|
|
}
|
|
|
|
if prev == nil {
|
|
l.Head = next
|
|
} else {
|
|
prev.next = next
|
|
}
|
|
item.next = nil
|
|
item.prev = nil
|
|
}
|
|
|
|
func (l *List[T]) MoveToFront(item *Item[T]) {
|
|
l.Remove(item)
|
|
l.Insert(item)
|
|
}
|
|
|
|
func (l *List[T]) Insert(item *Item[T]) {
|
|
head := l.Head
|
|
l.Head = item
|
|
if head == nil {
|
|
l.Tail = item
|
|
return
|
|
}
|
|
item.next = head
|
|
head.prev = item
|
|
}
|