mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 03:05:28 -05:00
[CCHeap] add delete_once
This commit is contained in:
parent
50d970852e
commit
8ac62ca04b
2 changed files with 31 additions and 0 deletions
|
|
@ -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 ->
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue