let unique_name_generator is_exception =
  let unique_names = Hashtbl.create 127 in
  let rec aux s =
    if is_exception s then s else
      try
        let s = if s = "" then "unnamed" else s in
        let count = Hashtbl.find unique_names s in
        let s = s ^ "_" ^ (string_of_int !count) in
        if Hashtbl.mem unique_names s then
          aux s
        else
          (Hashtbl.add unique_names s (ref 0);
           incr count; s)
      with Not_found ->
        Hashtbl.add unique_names s (ref 0); s
  and check s =
    try
      let _ = Hashtbl.find unique_names s in true
    with Not_found -> false
  in aux, check