text/cache/lru.go

Functions

Functions

func Clear

Clear removes all nodes from the list.

func (l *lruList[K]) Clear() {
	l.head = nil
	l.tail = nil
	l.len = 0
}

func Len

Len returns the number of nodes in the list.

func (l *lruList[K]) Len() int {
	return l.len
}

func MoveToFront

MoveToFront moves an existing node to the front (most recently used).

func (l *lruList[K]) MoveToFront(node *lruNode[K]) {
	if node == nil || node == l.head {
		return
	}

	// Remove from current position
	l.unlink(node)

	// Insert at front
	node.prev = nil
	node.next = l.head
	if l.head != nil {
		l.head.prev = node
	}
	l.head = node
	if l.tail == nil {
		l.tail = node
	}
	l.len++
}

func Oldest

Oldest returns the key of the least recently used node without removing it.

Returns zero value and false if list is empty.

func (l *lruList[K]) Oldest() (K, bool) {
	if l.tail == nil {
		var zero K
		return zero, false
	}
	return l.tail.key, true
}

func PushFront

PushFront adds a new node at the front (most recently used).

Returns the created node for later access.

func (l *lruList[K]) PushFront(key K) *lruNode[K] {
	node := &lruNode[K]{key: key}
	if l.head == nil {
		// Empty list
		l.head = node
		l.tail = node
	} else {
		// Insert at front
		node.next = l.head
		l.head.prev = node
		l.head = node
	}
	l.len++
	return node
}

func Remove

Remove removes a node from the list.

func (l *lruList[K]) Remove(node *lruNode[K]) {
	if node == nil {
		return
	}
	l.unlink(node)
}

func RemoveOldest

RemoveOldest removes and returns the key of the least recently used node.

Returns zero value and false if list is empty.

func (l *lruList[K]) RemoveOldest() (K, bool) {
	if l.tail == nil {
		var zero K
		return zero, false
	}

	node := l.tail
	l.unlink(node)
	return node.key, true
}