package queue
import (
"container/heap"
)
type PriorityQueueItem interface {
Less(other PriorityQueueItem) bool
}
type priorityQueue []PriorityQueueItem
func (pq priorityQueue) Len() int { return len(pq) }
func (pq priorityQueue) Less(i, j int) bool {
return pq[i].Less(pq[j])
}
func (pq priorityQueue) Swap(i, j int) {
pq[i], pq[j] = pq[j], pq[i]
}
func (pq *priorityQueue) Push(x interface{}) {
item := x.(PriorityQueueItem)
*pq = append(*pq, item)
}
func (pq *priorityQueue) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-1]
old[n-1] = nil
*pq = old[0 : n-1]
return item
}
type PriorityQueue struct {
queue priorityQueue
}
func (pq *PriorityQueue) Len() int {
return len(pq.queue)
}
func (pq *PriorityQueue) Empty() bool {
return len(pq.queue) == 0
}
func (pq *PriorityQueue) Push(item PriorityQueueItem) {
heap.Push(&pq.queue, item)
}
func (pq *PriorityQueue) Pop() PriorityQueueItem {
return heap.Pop(&pq.queue).(PriorityQueueItem)
}
func (pq *PriorityQueue) Top() PriorityQueueItem {
return pq.queue[0]
}