mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2024-12-21 10:13:11 +00:00
72 lines
1.3 KiB
Go
72 lines
1.3 KiB
Go
|
package ttlcache
|
||
|
|
||
|
import (
|
||
|
"container/heap"
|
||
|
)
|
||
|
|
||
|
func newPriorityQueue() *priorityQueue {
|
||
|
queue := &priorityQueue{}
|
||
|
heap.Init(queue)
|
||
|
return queue
|
||
|
}
|
||
|
|
||
|
type priorityQueue struct {
|
||
|
items []*item
|
||
|
}
|
||
|
|
||
|
func (pq *priorityQueue) update(item *item) {
|
||
|
heap.Fix(pq, item.queueIndex)
|
||
|
}
|
||
|
|
||
|
func (pq *priorityQueue) push(item *item) {
|
||
|
heap.Push(pq, item)
|
||
|
}
|
||
|
|
||
|
func (pq *priorityQueue) pop() *item {
|
||
|
if pq.Len() == 0 {
|
||
|
return nil
|
||
|
}
|
||
|
return heap.Pop(pq).(*item)
|
||
|
}
|
||
|
|
||
|
func (pq *priorityQueue) remove(item *item) {
|
||
|
heap.Remove(pq, item.queueIndex)
|
||
|
}
|
||
|
|
||
|
func (pq priorityQueue) Len() int {
|
||
|
length := len(pq.items)
|
||
|
return length
|
||
|
}
|
||
|
|
||
|
// Less will consider items with time.Time default value (epoch start) as more than set items.
|
||
|
func (pq priorityQueue) Less(i, j int) bool {
|
||
|
if pq.items[i].expireAt.IsZero() {
|
||
|
return false
|
||
|
}
|
||
|
if pq.items[j].expireAt.IsZero() {
|
||
|
return true
|
||
|
}
|
||
|
return pq.items[i].expireAt.Before(pq.items[j].expireAt)
|
||
|
}
|
||
|
|
||
|
func (pq priorityQueue) Swap(i, j int) {
|
||
|
pq.items[i], pq.items[j] = pq.items[j], pq.items[i]
|
||
|
pq.items[i].queueIndex = i
|
||
|
pq.items[j].queueIndex = j
|
||
|
}
|
||
|
|
||
|
func (pq *priorityQueue) Push(x interface{}) {
|
||
|
item := x.(*item)
|
||
|
item.queueIndex = len(pq.items)
|
||
|
pq.items = append(pq.items, item)
|
||
|
}
|
||
|
|
||
|
func (pq *priorityQueue) Pop() interface{} {
|
||
|
old := pq.items
|
||
|
n := len(old)
|
||
|
item := old[n-1]
|
||
|
item.queueIndex = -1
|
||
|
pq.items = old[0 : n-1]
|
||
|
return item
|
||
|
}
|