mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-08 12:15:32 -05:00
CCMultiSet.{add_mult,remove_mult,update}
This commit is contained in:
parent
4d0d988f4c
commit
13862b5133
2 changed files with 56 additions and 5 deletions
|
|
@ -45,6 +45,12 @@ module type S = sig
|
||||||
|
|
||||||
val remove : t -> elt -> t
|
val remove : t -> elt -> t
|
||||||
|
|
||||||
|
val add_mult : t -> elt -> int -> t
|
||||||
|
|
||||||
|
val remove_mult : t -> elt -> int -> t
|
||||||
|
|
||||||
|
val update : t -> elt -> (int -> int) -> t
|
||||||
|
|
||||||
val min : t -> elt
|
val min : t -> elt
|
||||||
|
|
||||||
val max : t -> elt
|
val max : t -> elt
|
||||||
|
|
@ -102,12 +108,31 @@ module Make(O : Set.OrderedType) = struct
|
||||||
let n = count ms x in
|
let n = count ms x in
|
||||||
M.add x (n+1) ms
|
M.add x (n+1) ms
|
||||||
|
|
||||||
let remove ms x =
|
let add_mult ms x n =
|
||||||
|
if n < 0 then invalid_arg "CCMultiSet.add_mult";
|
||||||
|
if n=0
|
||||||
|
then ms
|
||||||
|
else M.add x (count ms x + n) ms
|
||||||
|
|
||||||
|
let remove_mult ms x n =
|
||||||
|
if n < 0 then invalid_arg "CCMultiSet.remove_mult";
|
||||||
|
let cur_n = count ms x in
|
||||||
|
let new_n = cur_n - n in
|
||||||
|
if new_n <= 0
|
||||||
|
then M.remove x ms
|
||||||
|
else M.add x new_n ms
|
||||||
|
|
||||||
|
let remove ms x = remove_mult ms x 1
|
||||||
|
|
||||||
|
let update ms x f =
|
||||||
let n = count ms x in
|
let n = count ms x in
|
||||||
match n with
|
match f n with
|
||||||
| 0 -> ms
|
| 0 ->
|
||||||
| 1 -> M.remove x ms
|
if n=0 then ms else M.remove x ms
|
||||||
| _ -> M.add x (n-1) ms
|
| n' ->
|
||||||
|
if n' < 0
|
||||||
|
then invalid_arg "CCMultiSet.udpate"
|
||||||
|
else M.add x n' ms
|
||||||
|
|
||||||
let min ms =
|
let min ms =
|
||||||
fst (M.min_binding ms)
|
fst (M.min_binding ms)
|
||||||
|
|
@ -197,3 +222,12 @@ module Make(O : Set.OrderedType) = struct
|
||||||
seq (fun x -> m := add !m x);
|
seq (fun x -> m := add !m x);
|
||||||
!m
|
!m
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(*$T
|
||||||
|
let module S = CCMultiSet.Make(String) in \
|
||||||
|
S.count (S.add_mult S.empty "a" 5) "a" = 5
|
||||||
|
let module S = CCMultiSet.Make(String) in \
|
||||||
|
S.count (S.remove_mult (S.add_mult S.empty "a" 5) "a" 3) "a" = 2
|
||||||
|
let module S = CCMultiSet.Make(String) in \
|
||||||
|
S.count (S.remove_mult (S.add_mult S.empty "a" 4) "a" 6) "a" = 0
|
||||||
|
*)
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,23 @@ module type S = sig
|
||||||
|
|
||||||
val remove : t -> elt -> t
|
val remove : t -> elt -> t
|
||||||
|
|
||||||
|
val add_mult : t -> elt -> int -> t
|
||||||
|
(** [add_mult set x n] adds [n] occurrences of [x] to [set]
|
||||||
|
@raise Invalid_argument if [n < 0]
|
||||||
|
@since NEXT_RELEASE *)
|
||||||
|
|
||||||
|
val remove_mult : t -> elt -> int -> t
|
||||||
|
(** [remove_mult set x n] removes at most [n] occurrences of [x] from [set]
|
||||||
|
@raise Invalid_argument if [n < 0]
|
||||||
|
@since NEXT_RELEASE *)
|
||||||
|
|
||||||
|
val update : t -> elt -> (int -> int) -> t
|
||||||
|
(** [update set x f] calls [f n] where [n] is the current multiplicity
|
||||||
|
of [x] in [set] ([0] to indicate its absence); the result of [f n]
|
||||||
|
is the new multiplicity of [x].
|
||||||
|
@raise Invalid_argument if [f n < 0]
|
||||||
|
@since NEXT_RELEASE *)
|
||||||
|
|
||||||
val min : t -> elt
|
val min : t -> elt
|
||||||
(** Minimal element w.r.t the total ordering on elements *)
|
(** Minimal element w.r.t the total ordering on elements *)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue