diff --git a/hashset.ml b/hashset.ml new file mode 100644 index 00000000..bdbc058d --- /dev/null +++ b/hashset.ml @@ -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 diff --git a/hashset.mli b/hashset.mli new file mode 100644 index 00000000..c56c5ce5 --- /dev/null +++ b/hashset.mli @@ -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