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