mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-07 03:35:30 -05:00
Hashset based on PHashtbl
This commit is contained in:
parent
f363399fda
commit
d52441018c
2 changed files with 124 additions and 0 deletions
64
hashset.ml
Normal file
64
hashset.ml
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
(*
|
||||
Copyright (c) 2013, Simon Cruanes
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer. Redistributions in binary
|
||||
form must reproduce the above copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other materials provided with
|
||||
the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*)
|
||||
|
||||
(** {1 Mutable polymorphic hash-set} *)
|
||||
|
||||
type 'a t = ('a, unit) PHashtbl.t
|
||||
(** A set is a hashtable, with trivial values *)
|
||||
|
||||
let empty ?max_load ?eq ?hash size =
|
||||
PHashtbl.create ?max_load ?eq ?hash size
|
||||
|
||||
let copy set = PHashtbl.copy set
|
||||
|
||||
let clear set = PHashtbl.clear set
|
||||
|
||||
let cardinal set = PHashtbl.length set
|
||||
|
||||
let mem set x = PHashtbl.mem set x
|
||||
|
||||
let add set x = PHashtbl.add set x ()
|
||||
|
||||
let remove set x = PHashtbl.remove set x
|
||||
|
||||
let iter f set = PHashtbl.iter (fun x () -> f x) set
|
||||
|
||||
let fold f acc set = PHashtbl.fold (fun acc x () -> f acc x) acc set
|
||||
|
||||
let filter p set = PHashtbl.filter (fun x () -> p x) set
|
||||
|
||||
let to_seq set =
|
||||
Sequence.from_iter (fun k -> iter k set)
|
||||
|
||||
let of_seq set seq =
|
||||
Sequence.iter (fun x -> add set x) seq
|
||||
|
||||
let union s1 s2 =
|
||||
of_seq s1 (to_seq s2)
|
||||
|
||||
let inter s1 s2 =
|
||||
let set = copy s1 in
|
||||
filter (fun x -> mem s2 x) set;
|
||||
set
|
||||
60
hashset.mli
Normal file
60
hashset.mli
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
(*
|
||||
Copyright (c) 2013, Simon Cruanes
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer. Redistributions in binary
|
||||
form must reproduce the above copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other materials provided with
|
||||
the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*)
|
||||
|
||||
(** {1 Mutable polymorphic hash-set} *)
|
||||
|
||||
type 'a t = ('a, unit) PHashtbl.t
|
||||
(** A set is a hashtable, with trivial values *)
|
||||
|
||||
val empty : ?max_load:float -> ?eq:('a -> 'a -> bool) ->
|
||||
?hash:('a -> int) -> int -> 'a t
|
||||
(** See {@see PHashtbl.create} *)
|
||||
|
||||
val copy : 'a t -> 'a t
|
||||
|
||||
val clear : 'a t -> 'a t
|
||||
|
||||
val cardinal : 'a t -> int
|
||||
|
||||
val mem : 'a t -> 'a -> bool
|
||||
|
||||
val add : 'a t -> 'a -> unit
|
||||
|
||||
val remove : 'a t -> 'a -> unit
|
||||
|
||||
val iter : ('a -> unit) -> 'a t -> unit
|
||||
|
||||
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
|
||||
|
||||
val filter : ('a -> bool) -> 'a t -> unit
|
||||
(** destructive filter (remove elements that do not satisfy the predicate) *)
|
||||
|
||||
val to_seq : 'a t -> 'a Sequence.t
|
||||
|
||||
val of_seq : 'a t -> 'a Sequence.t -> unit
|
||||
|
||||
val union : 'a t -> 'a t -> 'a t
|
||||
|
||||
val inter : 'a t -> 'a t -> 'a t
|
||||
Loading…
Add table
Reference in a new issue