+module IntOT = struct
+ type t = int
+ let compare = Pervasives.compare
+end
+
+module IntSet = Set.Make(IntOT);;
+
+let n_purged = ref 0;;
+
+let collect alive1 alive2 alive3 =
+ let _ = <:start<collect>> in
+ let deps_of id =
+ let p,_,_ = proof_of_id id in
+ match p with
+ | Exact _ -> IntSet.empty
+ | Step (_,(_,id1,(_,id2),_)) ->
+ IntSet.add id1 (IntSet.add id2 IntSet.empty)
+ in
+ let rec close s =
+ let news = IntSet.fold (fun id s -> IntSet.union (deps_of id) s) s s in
+ if IntSet.equal news s then s else close news
+ in
+ let l_to_s s l = List.fold_left (fun s x -> IntSet.add x s) s l in
+ let alive_set = l_to_s (l_to_s (l_to_s IntSet.empty alive2) alive1) alive3 in
+ let closed_alive_set = close alive_set in
+ let to_purge =
+ Hashtbl.fold
+ (fun k _ s ->
+ if not (IntSet.mem k closed_alive_set) then
+ k::s else s) id_to_eq []
+ in
+ n_purged := !n_purged + List.length to_purge;
+ List.iter (Hashtbl.remove id_to_eq) to_purge;
+ let _ = <:stop<collect>> in ()
+;;
+
+let id_of e =
+ let _,_,_,_,id = open_equality e in id
+;;
+
+let get_stats () =
+ <:show<Equality.>> ^
+ "# of purged eq by the collector: " ^ string_of_int !n_purged ^ "\n"
+;;