Commit | Line | Data |
---|---|---|
34e49164 C |
1 | open Common |
2 | ||
3 | open Oset | |
4 | ||
5 | (* !!take care!!: this class does side effect, not a pure oassoc *) | |
6 | class ['a] oseth xs = | |
7 | object(o) | |
8 | inherit ['a] oset | |
9 | ||
10 | val data = Hashtbl.create 100 | |
11 | ||
12 | (* if put [] then no segfault, if [11] then segfault *) | |
13 | method toset = Obj.magic data | |
14 | ||
15 | method empty = {< data = Hashtbl.create 100 >} | |
16 | method add k = | |
17 | Hashtbl.add data k true; | |
18 | o | |
19 | ||
20 | method iter f = Hashtbl.iter (fun k v -> f k) data | |
21 | method view = raise Todo | |
22 | ||
23 | method del k = | |
24 | Hashtbl.remove data k; | |
25 | o | |
26 | method mem k = | |
27 | try (ignore(Hashtbl.find data k); true) | |
28 | with Not_found -> false | |
29 | ||
30 | method null = | |
31 | try (Hashtbl.iter (fun k v -> raise ReturnExn) data; false) | |
32 | with ReturnExn -> true | |
33 | ||
34 | (* TODO method length *) | |
35 | ||
36 | method union s = | |
37 | let v = Hashtbl.create 100 in | |
38 | o#iter (fun k -> Hashtbl.add v k true); | |
39 | s#iter (fun k -> Hashtbl.add v k true); | |
40 | {< data = v >} | |
41 | method inter s = | |
42 | let v = Hashtbl.create 100 in | |
43 | o#iter (fun k -> if s#mem k then Hashtbl.add v k true); | |
44 | {< data = v >} | |
45 | method minus s = | |
46 | let v = Hashtbl.create 100 in | |
47 | o#iter (fun k -> if not(s#mem k) then Hashtbl.add v k true); | |
48 | {< data = v >} | |
49 | ||
50 | (* override default *) | |
51 | method getone = | |
52 | let x = ref None in | |
53 | try ( | |
54 | Hashtbl.iter (fun k _ -> x := Some k; raise ReturnExn) data; | |
55 | raise Not_found | |
56 | ) | |
57 | with ReturnExn -> some !x | |
58 | ||
59 | ||
60 | end | |
61 | ||
62 |