1    type Set<T> @abstract =
2        include HashCollection<T, Entry<T>>
3            private all@
4            public contains
5            internal first
6                     array
7    
8        var size : u32 = 0
9        var version : u32 = 0
10   
11       def is_empty = size == 0
12       def is_not_empty = size <> 0
13   
14   type MutSet<T> @[mut_of Set] =
15       inherit Set<T>
16   
17       let put (x : T) =
18           let i = find_index x
19           if array[i].is_occupied then
20               false
21           else
22               let entry = Entry<T> key = x
23                                    f@ struct@zero
24               put entry
25               true
26   
27       def insert (x : T) =
28           if array.size == 0 || size as f32 / array.size as f32 >= 0.7 then
29               rebuild
30   
31           let result = put x
32           if result then
33               size += 1
34   
35           version += 1
36   
37           result
38   
39       def add x =
40           let result = insert x
41           assert result
42   
43       def remove x =
44           remove_key x
45           size -= 1
46           version += 1
47   
48       def clear =
49           remove_all
50           size = 0
51           version += 1
52   
53       def as_readonly = self as Set<T>
54