PriorityQueue

A mutable priority queue of elements. Always returns the element with the highest priority first, as determined by a user-provided comparison function.

Typical use cases include:

Example:

import PriorityQueue "mo:core/PriorityQueue";
import Nat "mo:core/Nat";

persistent actor {
  let pq = PriorityQueue.empty<Nat>();
  PriorityQueue.push(pq, Nat.compare, 5);
  PriorityQueue.push(pq, Nat.compare, 10);
  PriorityQueue.push(pq, Nat.compare, 3);
  assert PriorityQueue.pop(pq, Nat.compare) == ?10;
  assert PriorityQueue.pop(pq, Nat.compare) == ?5;
  assert PriorityQueue.pop(pq, Nat.compare) == ?3;
  assert PriorityQueue.pop(pq, Nat.compare) == null;
}

Internally implemented as a binary heap stored in a core library List.

Performance:

Implementation note (due to List):

type PriorityQueue<T> = Types.PriorityQueue<T>

public func empty<T>() : PriorityQueue<T>

Returns an empty priority queue.

Example:

import PriorityQueue "mo:core/PriorityQueue";

let pq = PriorityQueue.empty<Nat>();
assert PriorityQueue.isEmpty(pq);

Runtime: O(1). Space: O(1).

public func singleton<T>(element : T) : PriorityQueue<T>

Returns a priority queue containing a single element.

Example:

import PriorityQueue "mo:core/PriorityQueue";

let pq = PriorityQueue.singleton<Nat>(42);
assert PriorityQueue.peek(pq) == ?42;

Runtime: O(1). Space: O(1).

public func size<T>(self : PriorityQueue<T>) : Nat

Returns the number of elements in the priority queue.

Runtime: O(1).

public func isEmpty<T>(self : PriorityQueue<T>) : Bool

Returns true iff the priority queue is empty.

Example:

import PriorityQueue "mo:core/PriorityQueue";
import Nat "mo:core/Nat";

let pq = PriorityQueue.empty<Nat>();
assert PriorityQueue.isEmpty(pq);
PriorityQueue.push(pq, Nat.compare, 5);
assert not PriorityQueue.isEmpty(pq);

Runtime: O(1). Space: O(1).

public func clear<T>(self : PriorityQueue<T>)

Removes all elements from the priority queue.

Example:

import PriorityQueue "mo:core/PriorityQueue";
import Nat "mo:core/Nat";


let pq = PriorityQueue.empty<Nat>();
PriorityQueue.push(pq, Nat.compare, 5);
PriorityQueue.push(pq, Nat.compare, 10);
assert not PriorityQueue.isEmpty(pq);
PriorityQueue.clear(pq);
assert PriorityQueue.isEmpty(pq);

Runtime: O(1). Space: O(1).

public func push<T>(
  self : PriorityQueue<T>,
  compare : (implicit : (T, T) -> Order.Order),
  element : T
)

Inserts a new element into the priority queue.

compare – comparison function that defines priority ordering.

Example:

import PriorityQueue "mo:core/PriorityQueue";
import Nat "mo:core/Nat";

let pq = PriorityQueue.empty<Nat>();
PriorityQueue.push(pq, Nat.compare, 5);
PriorityQueue.push(pq, Nat.compare, 10);
assert PriorityQueue.peek(pq) == ?10;

Runtime: O(log n). Space: O(1).

public func peek<T>(self : PriorityQueue<T>) : ?T

Returns the element with the highest priority, without removing it. Returns null if the queue is empty.

Example:

import PriorityQueue "mo:core/PriorityQueue";

let pq = PriorityQueue.singleton<Nat>(42);
assert PriorityQueue.peek(pq) == ?42;

Runtime: O(1). Space: O(1).

public func pop<T>(self : PriorityQueue<T>, compare : (implicit : (T, T) -> Order.Order)) : ?T

Removes and returns the element with the highest priority. Returns null if the queue is empty.

compare – comparison function that defines priority ordering.

Example:

import PriorityQueue "mo:core/PriorityQueue";
import Nat "mo:core/Nat";

let pq = PriorityQueue.empty<Nat>();
PriorityQueue.push(pq, Nat.compare, 5);
PriorityQueue.push(pq, Nat.compare, 10);
assert PriorityQueue.pop(pq, Nat.compare) == ?10;

Runtime: O(log n). Space: O(1).