package pq // CompareFunc defines a comparison function. type CompareFunc func(a, b interface{}) bool // Item is an item in the PriorityQueue. type Item struct { Value interface{} Priority int } // PriorityQueue implements heap.Interface and holds Items. type PriorityQueue []*Item func (pq PriorityQueue) Len() int { return len(pq) } func (pq PriorityQueue) Less(i, j int) bool { return pq[i].Priority < pq[j].Priority } func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] } // Push pushes an item into the queue. func (pq *PriorityQueue) Push(x interface{}) { if item, ok := x.(*Item); ok { *pq = append(*pq, item) } } // Pop pops an item from the queue. func (pq *PriorityQueue) Pop() interface{} { n := len(*pq) item := (*pq)[n-1] (*pq)[n-1] = nil *pq = (*pq)[0 : n-1] return item } // Has checks if queue has an item. func (pq PriorityQueue) Has(x interface{}, cmp CompareFunc) bool { for _, item := range pq { if cmp(x, item.Value) { return true } } return false }