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)
							 | 
						||
| 
								 | 
							
								}
							 |