open Okasaki
open OrderedSig
open HeapSig
module LeftistHeap (Element : Ordered) : Heap =
struct
module Element = Element
type heaps = Empty | Node of int * Element.t * heaps * heaps
type heap = heaps
let rank = function
| Empty -> 0
| Node (r,_,_,_) -> r
let make_node x a b =
if rank a >= rank b
then Node (rank b + 1, x, a, b)
else Node (rank a + 1, x, b, a)
let empty = Empty
let is_empty = function
| Empty -> true
| _ -> false
let rec merge h1 h2 =
match h1, h2 with
| _, Empty -> h1
| Empty, _ -> h2
| Node (_, x, a1, b1), Node (_, y, a2, b2) ->
if Element.leq x y
then make_node x a1 (merge b1 h2)
else make_node y a2 (merge h1 b2)
let insert x h =
merge (Node (1, x, Empty, Empty)) h
let find_min = function
| Empty -> raise EmptyStructure
| Node (_, x, _, _) -> x
let delete_min = function
| Empty -> raise EmptyStructure
| Node (_, x, a, b) -> merge a b
end |