1 | module datatypes |
2 | |
3 | pub struct Set[T] { |
4 | mut: |
5 | elements map[T]u8 |
6 | } |
7 | |
8 | // checks the element is exists. |
9 | pub fn (set Set[T]) exists(element T) bool { |
10 | return element in set.elements |
11 | } |
12 | |
13 | // adds the element to set, if it is not present already. |
14 | pub fn (mut set Set[T]) add(element T) { |
15 | set.elements[element] = 1 |
16 | } |
17 | |
18 | // removes the element from set. |
19 | pub fn (mut set Set[T]) remove(element T) { |
20 | set.elements.delete(element) |
21 | } |
22 | |
23 | // pick returns an arbitrary element of set, if set is not empty. |
24 | pub fn (set Set[T]) pick() !T { |
25 | for k, _ in set.elements { |
26 | return k |
27 | } |
28 | return error('Set is empty.') |
29 | } |
30 | |
31 | // rest returns the set consisting of all elements except for the arbitrary element. |
32 | pub fn (mut set Set[T]) rest() ![]T { |
33 | element := set.pick()! |
34 | return set.elements.keys().filter(it != element) |
35 | } |
36 | |
37 | // pop returns an arbitrary element and deleting it from set. |
38 | pub fn (mut set Set[T]) pop() !T { |
39 | element := set.pick()! |
40 | set.elements.delete(element) |
41 | return element |
42 | } |
43 | |
44 | // delete all elements of set. |
45 | pub fn (mut set Set[T]) clear() { |
46 | set.elements = map[T]u8{} |
47 | } |
48 | |
49 | // == checks whether the two given sets are equal (i.e. contain all and only the same elements). |
50 | pub fn (l Set[T]) == (r Set[T]) bool { |
51 | if l.elements.len != r.elements.len { |
52 | return false |
53 | } |
54 | for e, _ in r.elements { |
55 | if e !in l.elements { |
56 | return false |
57 | } |
58 | } |
59 | return true |
60 | } |
61 | |
62 | // is_empty checks whether the set is empty or not. |
63 | pub fn (set Set[T]) is_empty() bool { |
64 | return set.size() == 0 |
65 | } |
66 | |
67 | // size returns the number of elements in the set. |
68 | pub fn (set Set[T]) size() int { |
69 | return set.elements.len |
70 | } |
71 | |
72 | // copy returns a copy of all the elements in the set. |
73 | pub fn (set Set[T]) copy() Set[T] { |
74 | return Set[T]{ |
75 | elements: set.elements.clone() |
76 | } |
77 | } |
78 | |
79 | // add_all adds the whole `elements` array to the set |
80 | pub fn (mut set Set[T]) add_all(elements []T) { |
81 | for element in elements { |
82 | set.add(element) |
83 | } |
84 | } |
85 | |
86 | // @union returns the union of the two sets. |
87 | pub fn (l Set[T]) @union(r Set[T]) Set[T] { |
88 | mut set := l |
89 | for e, _ in r.elements { |
90 | set.add(e) |
91 | } |
92 | return set |
93 | } |
94 | |
95 | // intersection returns the intersection of sets. |
96 | pub fn (l Set[T]) intersection(r Set[T]) Set[T] { |
97 | mut set := l |
98 | for e, _ in l.elements { |
99 | if !r.exists(e) { |
100 | set.remove(e) |
101 | } |
102 | } |
103 | for e, _ in r.elements { |
104 | if !l.exists(e) { |
105 | set.remove(e) |
106 | } |
107 | } |
108 | return set |
109 | } |
110 | |
111 | // - returns the difference of sets. |
112 | pub fn (l Set[T]) - (r Set[T]) Set[T] { |
113 | mut set := l |
114 | for e, _ in l.elements { |
115 | if r.exists(e) { |
116 | set.remove(e) |
117 | } |
118 | } |
119 | return set |
120 | } |
121 | |
122 | // subset returns true if the set `r` is a subset of the set `l`. |
123 | pub fn (l Set[T]) subset(r Set[T]) bool { |
124 | for e, _ in r.elements { |
125 | if e !in l.elements { |
126 | return false |
127 | } |
128 | } |
129 | return true |
130 | } |