Commit | Line | Data |
---|---|---|
28875fec SK |
1 | module H = MoreLabels.Hashtbl |
2 | ||
3 | type t = | |
4 | { name : string | |
5 | ; symbol : int | |
6 | } | |
7 | ||
54fbe594 SK |
8 | let next = |
9 | let counter = ref 0 in | |
10 | fun () -> | |
11 | incr counter; | |
12 | !counter | |
28875fec SK |
13 | |
14 | let symbols = H.create 16 | |
15 | ||
fd2204fa | 16 | let unique_of_string name = |
54fbe594 | 17 | {name; symbol = next ()} |
35dccbd3 | 18 | |
28875fec SK |
19 | let of_string name = |
20 | match H.find_opt symbols name with | |
fd2204fa SK |
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 | |
28875fec SK |
27 | |
28 | let to_string {name; _} = | |
29 | name | |
cbb4ffb6 SK |
30 | |
31 | let is_equal {symbol=s1; _} {symbol=s2; _} = | |
32 | s1 = s2 | |
35dccbd3 SK |
33 | |
34 | let show {name; symbol} = | |
35 | Printf.sprintf "Symbol[%S, %d]" name symbol |