@technobuddha/library
Version: 
A large library of useful functions
86 lines • 3.95 kB
JavaScript
/**
 * A simple priority queue
 * @group Utility
 * @category Classes
 */
export class PriorityQueue {
    comparator;
    /**
     * Creates a new PriorityQueue.
     *
     * @param comparator - Function to compare two elements and puts them in priority order.  Takes two elements as arguments and returns a number greater, less
     * then or equal to zero.
     * @param contents - Initial contents of the queue
     */
    constructor(comparator, contents) {
        this.comparator = comparator;
        this.contents = Array.from(contents ?? []);
        this.sorted = false;
    }
    contents;
    sorted;
    sort() {
        this.contents.sort(this.comparator);
        this.sorted = true;
    }
    /**
     * Add an element to the queue
     * @param o - element to be added
     */
    push(...o) {
        this.contents.push(...o);
        this.sorted = false;
    }
    /**
     * Return and remove the highest priority item from the queue
     *
     * @returns queue element
     */
    pop() {
        if (!this.sorted) {
            this.sort();
        }
        return this.contents.shift();
    }
    /**
     * Iterate through all elements in the queue
     *
     * @returns generator function
     */
    *[Symbol.iterator]() {
        if (!this.sorted) {
            this.sort();
        }
        yield* this.contents;
    }
    /**
     * Determine the number of items in the queue
     *
     * @returns number of element in the queue
     */
    get size() {
        return this.contents.length;
    }
    /**
     * Transform all elements in the queue
     *
     * @param f - Function to transform each element of the queue
     * @returns array of transformed queue elements
     */
    map(f) {
        if (!this.sorted) {
            this.sort();
        }
        return this.contents.map(f);
    }
    /**
     * Change the function used to order the queue
     *
     * @param newComparator - function to compare elements of the queue
     */
    reorder(newComparator) {
        this.comparator = newComparator;
        this.sorted = false;
    }
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpb3JpdHktcXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJpb3JpdHktcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBU2Q7SUFSVjs7Ozs7O09BTUc7SUFDSCxZQUNVLFVBQWtDLEVBQzFDLFFBQXNCO1FBRGQsZUFBVSxHQUFWLFVBQVUsQ0FBd0I7UUFHMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFJLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRWdCLFFBQVEsQ0FBTTtJQUN2QixNQUFNLENBQVU7SUFFaEIsSUFBSTtRQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLEdBQUcsQ0FBTTtRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksR0FBRztRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUNELEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEdBQUcsQ0FBSSxDQUE2QztRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksT0FBTyxDQUFDLGFBQXFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7Q0FDRiJ9