| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | 
							- /*
 
-  * Public Domain Software
 
-  *
 
-  * I (Matthias Ladkau) am the author of the source code in this file.
 
-  * I have placed the source code in this file in the public domain.
 
-  *
 
-  * For further information see: http://creativecommons.org/publicdomain/zero/1.0/
 
-  */
 
- package sortutil
 
- import "container/heap"
 
- /*
 
- IntHeap is a classic heap with int values.
 
- */
 
- type IntHeap []int
 
- func (h IntHeap) Len() int           { return len(h) }
 
- func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }
 
- func (h IntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
 
- /*
 
- Push adds an item to the heap.
 
- */
 
- func (h *IntHeap) Push(x interface{}) {
 
- 	*h = append(*h, x.(int))
 
- }
 
- /*
 
- Pop removes an item to the heap.
 
- */
 
- func (h *IntHeap) Pop() interface{} {
 
- 	old := *h
 
- 	n := len(old)
 
- 	x := old[n-1]
 
- 	*h = old[0 : n-1]
 
- 	return x
 
- }
 
- /*
 
- Peek returns the next item but does not remove it like Pop.
 
- */
 
- func (h *IntHeap) Peek() int {
 
- 	return (*h)[0]
 
- }
 
- /*
 
- RemoveFirst removes the first occurrences of item r from the IntHeap.
 
- */
 
- func (h *IntHeap) RemoveFirst(r int) {
 
- 	heapList := *h
 
- 	for i, item := range heapList {
 
- 		if item == r {
 
- 			if i+1 < len(heapList) {
 
- 				*h = append(heapList[:i], heapList[i+1:]...)
 
- 				heap.Fix(h, i)
 
- 				break
 
- 			} else {
 
- 				*h = heapList[:i]
 
- 			}
 
- 		}
 
- 	}
 
- }
 
- /*
 
- RemoveAll removes all occurrences of item r from the IntHeap.
 
- */
 
- func (h *IntHeap) RemoveAll(r int) {
 
- 	newHeap := &IntHeap{}
 
- 	for len(*h) > 0 {
 
- 		item := heap.Pop(h)
 
- 		if item != r {
 
- 			heap.Push(newHeap, item)
 
- 		}
 
- 	}
 
- 	(*h) = *newHeap
 
- }
 
 
  |