Current section
Files
Jump to
Current section
Files
src/gleamy/structures/priority_queue.gleam
import gleam/order.{Order}
import gleam/list
import gleamy/structures/heap/pairing_heap as heap
type Queue(a) =
heap.Heap(a)
pub fn from_list(list: List(a), compare: fn(a, a) -> Order) -> Queue(a) {
list.fold(list, new(compare), heap.insert)
}
pub fn is_empty(queue: Queue(a)) -> Bool {
case heap.find_min(queue) {
Ok(_) -> False
Error(_) -> True
}
}
pub fn count(queue: Queue(a)) -> Int {
case heap.delete_min(queue) {
Ok(#(_, q)) -> count(q) + 1
Error(_) -> 0
}
}
pub fn new(compare: fn(a, a) -> Order) -> Queue(a) {
heap.new(compare)
}
pub fn pop(from queue: Queue(a)) -> Result(#(a, Queue(a)), Nil) {
heap.delete_min(queue)
}
pub fn peek(from queue: Queue(a)) -> Result(a, Nil) {
heap.find_min(queue)
}
pub fn push(onto queue: Queue(a), this item: a) -> Queue(a) {
heap.insert(queue, item)
}
pub fn reorder(queue: Queue(a), compare: fn(a, a) -> Order) -> Queue(a) {
case heap.delete_min(queue) {
Ok(#(x, q)) -> heap.insert(reorder(q, compare), x)
Error(_) -> heap.new(compare)
}
}
pub fn to_list(queue: Queue(a)) -> List(a) {
case heap.delete_min(queue) {
Ok(#(x, q)) -> [x, ..to_list(q)]
Error(_) -> []
}
}