v / vlib / datatypes
Raw file | 130 loc (113 sloc) | 2.96 KB | Latest commit hash f16722596
1module datatypes
2
3pub struct Set[T] {
4mut:
5 elements map[T]u8
6}
7
8// checks the element is exists.
9pub 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.
14pub fn (mut set Set[T]) add(element T) {
15 set.elements[element] = 1
16}
17
18// removes the element from set.
19pub 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.
24pub 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.
32pub 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.
38pub 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.
45pub 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).
50pub 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.
63pub fn (set Set[T]) is_empty() bool {
64 return set.size() == 0
65}
66
67// size returns the number of elements in the set.
68pub 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.
73pub 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
80pub 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.
87pub 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.
96pub 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.
112pub 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`.
123pub 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}