58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | // This is a duplicated and slightly modified version of "gopkg.in/karalabe/cookiejar.v2/collections/prque". | ||
|  | 
 | ||
|  | package prque | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"container/heap" | ||
|  | ) | ||
|  | 
 | ||
|  | // Priority queue data structure. | ||
|  | type Prque struct { | ||
|  | 	cont *sstack | ||
|  | } | ||
|  | 
 | ||
|  | // Creates a new priority queue. | ||
|  | func New(setIndex setIndexCallback) *Prque { | ||
|  | 	return &Prque{newSstack(setIndex)} | ||
|  | } | ||
|  | 
 | ||
|  | // Pushes a value with a given priority into the queue, expanding if necessary. | ||
|  | func (p *Prque) Push(data interface{}, priority int64) { | ||
|  | 	heap.Push(p.cont, &item{data, priority}) | ||
|  | } | ||
|  | 
 | ||
|  | // Pops the value with the greates priority off the stack and returns it. | ||
|  | // Currently no shrinking is done. | ||
|  | func (p *Prque) Pop() (interface{}, int64) { | ||
|  | 	item := heap.Pop(p.cont).(*item) | ||
|  | 	return item.value, item.priority | ||
|  | } | ||
|  | 
 | ||
|  | // Pops only the item from the queue, dropping the associated priority value. | ||
|  | func (p *Prque) PopItem() interface{} { | ||
|  | 	return heap.Pop(p.cont).(*item).value | ||
|  | } | ||
|  | 
 | ||
|  | // Remove removes the element with the given index. | ||
|  | func (p *Prque) Remove(i int) interface{} { | ||
|  | 	if i < 0 { | ||
|  | 		return nil | ||
|  | 	} | ||
|  | 	return heap.Remove(p.cont, i) | ||
|  | } | ||
|  | 
 | ||
|  | // Checks whether the priority queue is empty. | ||
|  | func (p *Prque) Empty() bool { | ||
|  | 	return p.cont.Len() == 0 | ||
|  | } | ||
|  | 
 | ||
|  | // Returns the number of element in the priority queue. | ||
|  | func (p *Prque) Size() int { | ||
|  | 	return p.cont.Len() | ||
|  | } | ||
|  | 
 | ||
|  | // Clears the contents of the priority queue. | ||
|  | func (p *Prque) Reset() { | ||
|  | 	*p = *New(p.cont.setIndex) | ||
|  | } |