diff --git a/src/core/CCHeap.ml b/src/core/CCHeap.ml index b85ce53f..238186e0 100644 --- a/src/core/CCHeap.ml +++ b/src/core/CCHeap.ml @@ -118,6 +118,11 @@ module type S = sig (** Same as {!take}, but can fail. @raise Empty if the heap is empty *) + val delete_once : (elt -> elt -> bool) -> elt -> t -> t + (** Delete one occurence of a value if it exist in the heap. + [delete_once eq x h], use [eq] to find one [x] in [h] and delete it. + If [h] do not contain [x] then it return [h]. *) + val delete_all : (elt -> elt -> bool) -> elt -> t -> t (** Delete all occurrences of a value in the heap. [delete_all eq x h], use [eq] to find all [x] in [h] and delete them. @@ -250,6 +255,26 @@ module Make(E : PARTIAL_ORD) : S with type elt = E.t = struct | E -> raise Empty | N (_, x, l, r) -> merge l r, x + let delete_once eq x h = + let rec aux = function + | E -> false, E + | N(_, y, l, r) as h -> begin + if eq x y then true, merge l r + else begin + if E.leq y x + then begin + let found_left, l1 = aux l in + let found, r1 = if found_left then true, r else aux r in + if found + then true, _make_node y l1 r1 + else false, h + end + else false, h + end + end + in + snd (aux h) + let rec delete_all eq x = function | E -> E | N (_, y, l, r) as h -> diff --git a/src/core/CCHeap.mli b/src/core/CCHeap.mli index ac320aef..d47a6899 100644 --- a/src/core/CCHeap.mli +++ b/src/core/CCHeap.mli @@ -55,6 +55,12 @@ module type S = sig (** Same as {!take}, but can fail. @raise Empty if the heap is empty *) + val delete_once : (elt -> elt -> bool) -> elt -> t -> t + (** Delete one occurence of a value if it exist in the heap. + [delete_once eq x h], use [eq] to find one [x] in [h] and delete it. + If [h] do not contain [x] then it return [h]. + @since NEXT_RELEASE *) + val delete_all : (elt -> elt -> bool) -> elt -> t -> t (** Delete all occurrences of a value in the heap. [delete_all eq x h], use [eq] to find all [x] in [h] and delete them.