82 lines
1.7 KiB
Markdown
82 lines
1.7 KiB
Markdown
# priority-queue
|
|
|
|
functional, data oriented priority queue that doesn't suck
|
|
|
|
![tests](https://github.com/mreinstein/priority-queue/actions/workflows/main.yml/badge.svg)
|
|
|
|
|
|
There are many priority queue implementations on the web, but I couldn't find any that meet these critera:
|
|
|
|
* **does not allocate memory at run time**
|
|
* has tests
|
|
* is functional, data oriented
|
|
* is tiny! (~150 lines of code)
|
|
* is a pure ES module
|
|
|
|
|
|
So here we are!
|
|
|
|
|
|
## Usage
|
|
|
|
```javascript
|
|
import PQ from 'priority-queue'
|
|
|
|
|
|
// create a new priority queue that can hold a maximum of 20,000 items.
|
|
// by default max length is 1000
|
|
const MAX_LENGTH = 20000
|
|
const obj = PQ.create(MAX_LENGTH)
|
|
|
|
|
|
// insert a few items
|
|
PQ.queue(obj, 'e', 1)
|
|
PQ.queue(obj, 'f', 9)
|
|
PQ.queue(obj, 'g', 4)
|
|
|
|
// get the highest priority item out of the queue
|
|
console.log(PQ.dequeue(obj)) // 'f'
|
|
console.log(PQ.dequeue(obj)) // 'g'
|
|
console.log(PQ.dequeue(obj)) // 'e'
|
|
|
|
// when the queue is empty it'll return undefined on dequeue
|
|
console.log(PQ.dequeue(obj)) // undefined
|
|
```
|
|
|
|
|
|
## API
|
|
|
|
* `queue` - add an element to the queue
|
|
* `dequeue` - delete the max priority element from the queue
|
|
* `isEmpty` - returns true/false
|
|
* `clear` - clear the queue
|
|
* `delete` - If we need to update the priority, delete that item and insert it in again
|
|
* `list` - contents of heap
|
|
|
|
|
|
### Using classes/objects
|
|
|
|
```javascript
|
|
class Box {
|
|
constructor(w, l) {
|
|
this.w = w
|
|
this.l = l
|
|
this.area = w * l // this is priority
|
|
}
|
|
}
|
|
|
|
const obj = PQ.create()
|
|
const a = new Box(5, 5)
|
|
const b = new Box(9, 9)
|
|
const c = new Box(2, 3)
|
|
const d = new Box(3, 3)
|
|
|
|
PQ.queue(obj, a, a.area)
|
|
PQ.queue(obj, c, c.area)
|
|
PQ.queue(obj, d, d.area)
|
|
PQ.queue(obj, b, b.area)
|
|
|
|
assert.deepEqual(PQ.dequeue(obj), b)
|
|
assert.deepEqual(PQ.dequeue(obj), a)
|
|
```
|