| 1 | module H = MoreLabels.Hashtbl |
| 2 | |
| 3 | type t = |
| 4 | { name : string |
| 5 | ; symbol : int |
| 6 | } |
| 7 | |
| 8 | let next = |
| 9 | let counter = ref 0 in |
| 10 | fun () -> |
| 11 | incr counter; |
| 12 | !counter |
| 13 | |
| 14 | let symbols = H.create 16 |
| 15 | |
| 16 | let unique_of_string name = |
| 17 | {name; symbol = next ()} |
| 18 | |
| 19 | let of_string name = |
| 20 | match H.find_opt symbols name with |
| 21 | | Some symbol -> |
| 22 | {name; symbol} |
| 23 | | None -> |
| 24 | let t = unique_of_string name in |
| 25 | H.replace symbols ~key:t.name ~data:t.symbol; |
| 26 | t |
| 27 | |
| 28 | let to_string {name; _} = |
| 29 | name |
| 30 | |
| 31 | let is_equal {symbol=s1; _} {symbol=s2; _} = |
| 32 | s1 = s2 |
| 33 | |
| 34 | let show {name; symbol} = |
| 35 | Printf.sprintf "Symbol[%S, %d]" name symbol |