INCLUDE "utils.ml" module type SA = sig type data type t val make : data -> t val node : t -> data val hash : t -> int val uid : t -> Uid.t val equal : t -> t -> bool val with_id : Uid.t -> t end module type S = sig type data type t = private { id : Uid.t; key : int; node : data } val make : data -> t val node : t -> data val hash : t -> int val uid : t -> Uid.t val equal : t -> t -> bool val with_id : Uid.t -> t end module Make (H : Hashtbl.HashedType) : S with type data = H.t = struct let uid_make = Uid.make_maker() type data = H.t type t = { id : Uid.t; key : int; node : data } let node t = t.node let uid t = t.id let hash t = t.key let equal t1 t2 = t1 == t2 module WH = Weak.Make( struct type _t = t type t = _t let hash = hash let equal a b = a == b || H.equal a.node b.node end) let pool = WH.create MED_H_SIZE let make x = let cell = { id = uid_make(); key = H.hash x; node = x } in WH.merge pool cell exception Found of t let with_id id = try WH.iter (fun r -> if r.id == id then raise (Found r)) pool; raise Not_found with | Found r -> r | e -> raise e ;; end