diff options
Diffstat (limited to 'golang/pkg/api/priority_queue.go')
-rw-r--r-- | golang/pkg/api/priority_queue.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/golang/pkg/api/priority_queue.go b/golang/pkg/api/priority_queue.go new file mode 100644 index 0000000..077c8f7 --- /dev/null +++ b/golang/pkg/api/priority_queue.go @@ -0,0 +1,44 @@ +package api + +type Request struct { + index int + priority int + + method string + path string + payload any + resp chan *Response +} + +type PriorityQueue []*Request + +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] + pq[i].index = i + pq[j].index = j +} + +func (pq *PriorityQueue) Push(x any) { + n := len(*pq) + item := x.(*Request) + item.index = n + *pq = append(*pq, item) +} + +func (pq *PriorityQueue) Pop() any { + old := *pq + n := len(old) + item := old[n-1] + old[n-1] = nil // avoid memory leak + item.index = -1 // for safety + *pq = old[0 : n-1] + return item +} |