module Test = (val Containers_testlib.make ~__FILE__()) open Test type elt = { x: string; mutable rank: int; mutable idx: int; } module Elt = struct type t = elt let idx x = x.idx let set_idx x i = x.idx <- i let lt a b = if a.rank = b.rank then a.x < b.x else a.rank < b.rank end module H = CCMutHeap.Make(Elt);; t @@ fun () -> let h = H.create() in let x1 = {x="a"; rank=10; idx= -1} in let x2 = {x="b"; rank=10; idx= -1} in let x3 = {x="c"; rank=10; idx= -1} in H.insert h x1; assert (H.in_heap x1); assert (not (H.in_heap x2)); assert (not (H.in_heap x3)); H.insert h x2; H.insert h x3; assert (Elt.lt x1 x2); assert (Elt.lt x2 x3); let x = H.remove_min h in assert (x == x1); let x = H.remove_min h in assert (x == x2); let x = H.remove_min h in assert (x == x3); assert (try ignore (H.remove_min h); false with Not_found -> true); true;; t @@ fun () -> let h = H.create() in let x1 = {x="a"; rank=10; idx= -1} in let x2 = {x="b"; rank=10; idx= -1} in let x3 = {x="c"; rank=10; idx= -1} in H.insert h x1; H.insert h x2; H.insert h x3; x3.rank <- 2; H.decrease h x3; assert (Elt.lt x3 x1); assert (Elt.lt x3 x2); let x = H.remove_min h in assert (x == x3); x1.rank <- 20; H.increase h x1; let x = H.remove_min h in assert (x == x2); let x = H.remove_min h in assert (x == x1); assert (try ignore (H.remove_min h); false with Not_found -> true); true;;