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 | ||
35dccbd3 SK |
12 | let next name = |
13 | incr counter; | |
14 | let symbol = !counter in | |
15 | {name; symbol} | |
16 | ||
17 | let new_of_string name = | |
18 | let t = next name in | |
19 | H.replace symbols ~key:t.name ~data:t.symbol; | |
20 | t | |
21 | ||
28875fec SK |
22 | let of_string name = |
23 | match H.find_opt symbols name with | |
35dccbd3 SK |
24 | | Some s -> {name; symbol=s} |
25 | | None -> new_of_string name | |
28875fec SK |
26 | |
27 | let to_string {name; _} = | |
28 | name | |
cbb4ffb6 SK |
29 | |
30 | let is_equal {symbol=s1; _} {symbol=s2; _} = | |
31 | s1 = s2 | |
35dccbd3 SK |
32 | |
33 | let show {name; symbol} = | |
34 | Printf.sprintf "Symbol[%S, %d]" name symbol |