module H = MoreLabels.Hashtbl type t = { name : string ; symbol : int } let nextsym = ref 0 let symbols = H.create 16 let of_string name = match H.find_opt symbols name with | Some symbol -> {name; symbol} | None -> incr nextsym; let symbol = !nextsym in H.replace symbols ~key:name ~data:symbol; {name; symbol} let to_string {name; _} = name let is_equal {symbol=s1; _} {symbol=s2; _} = s1 = s2