[CCHeap] add delete_once

This commit is contained in:
Fardale 2018-01-28 12:37:21 +01:00
parent 50d970852e
commit 8ac62ca04b
2 changed files with 31 additions and 0 deletions

View file

@ -118,6 +118,11 @@ module type S = sig
(** Same as {!take}, but can fail. (** Same as {!take}, but can fail.
@raise Empty if the heap is empty *) @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 val delete_all : (elt -> elt -> bool) -> elt -> t -> t
(** Delete all occurrences of a value in the heap. (** 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. [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 | E -> raise Empty
| N (_, x, l, r) -> merge l r, x | 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 let rec delete_all eq x = function
| E -> E | E -> E
| N (_, y, l, r) as h -> | N (_, y, l, r) as h ->

View file

@ -55,6 +55,12 @@ module type S = sig
(** Same as {!take}, but can fail. (** Same as {!take}, but can fail.
@raise Empty if the heap is empty *) @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 val delete_all : (elt -> elt -> bool) -> elt -> t -> t
(** Delete all occurrences of a value in the heap. (** 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. [delete_all eq x h], use [eq] to find all [x] in [h] and delete them.