2 (** FIXME: document here *)
6 let compare = String.compare
10 include Set.Make (String)
12 let f res e = add e res in
13 List.fold_left f empty l
14 let unionl l = List.fold_left union empty l
18 module Map = Map.Make (String)
23 type universe = { prefix : string ; mutable next : int }
25 let added_suffix = "_"
27 let is_prefix prefix s =
28 let l = String.length prefix in
29 (String.length s >= l) && (String.sub s 0 l = prefix)
31 let has_prefix set prefix =
32 let f s b = b || (is_prefix prefix s) in
35 let fresh_prefix set prefix =
37 if has_prefix set prefix then aux (prefix ^ added_suffix)
42 let new_universe s = { prefix = s ; next = 0 }
45 let s = u.prefix ^ (string_of_int u.next) in
46 u.next <- u.next + 1 ;
52 let set_ref = ref set in
54 let res = Gen.fresh_prefix !set_ref s in
55 set_ref := Set.add res !set_ref ;
59 let make_fresh set prefix =
60 let fresh_prefix = Gen.fresh_prefix set prefix in
61 let universe = Gen.new_universe fresh_prefix in
62 (fun () -> Gen.fresh universe)