module datatypes pub struct Set { mut: elements map[T]u8 } // checks the element is exists. fn (set Set) exists(element T) bool { return element in set.elements } // adds the element to set, if it is not present already. fn (mut set Set) add(element T) { set.elements[element] = 1 } // removes the element from set. fn (mut set Set) remove(element T) { set.elements.delete(element) } // pick returns an arbitrary element of set, if set is not empty. fn (mut set Set) pick() ?T { for k, _ in set.elements { return k } return error('Set is empty.') } // rest returns the set consisting of all elements except for the arbitrary element. fn (mut set Set) rest() ?[]T { element := set.pick()? return set.elements.keys().filter(it != element) } // pop returns an arbitrary element and deleting it from set. fn (mut set Set) pop() ?T { element := set.pick()? set.elements.delete(element) return element } // delete all elements of set. fn (mut set Set) clear() { set.elements = map[T]u8{} } // checks whether the two given sets are equal (i.e. contain all and only the same elements). fn (mut l Set) equal(r Set) bool { if l.elements.len != r.elements.len { return false } for e, _ in r.elements { if e !in l.elements { return false } } return true } // checks whether the set is empty. fn (mut set Set) is_empty() bool { return set.size() == 0 } // size returns the number of elements in the set. fn (mut set Set) size() int { return set.elements.len } // copy returns a copy of all the elements in the set. fn (mut set Set) copy() Set { return Set{ elements: set.elements.clone() } } // add_all adds the whole `elements` array to the set fn (mut set Set) add_all(elements []T) { for element in elements { set.add(element) } } // @union returns the union of the two sets. fn (mut l Set) @union(r Set) Set { mut set := l for e, _ in r.elements { set.add(e) } return set } // intersection returns the intersection of sets. fn (mut l Set) intersection(r Set) Set { mut set := l for e, _ in l.elements { if !r.exists(e) { set.remove(e) } } for e, _ in r.elements { if !l.exists(e) { set.remove(e) } } return set } // difference returns the difference of sets. fn (mut l Set) difference(r Set) Set { mut set := l for e, _ in l.elements { if r.exists(e) { set.remove(e) } } return set } // subset returns true if the set `r` is a subset of the set `l`. fn (mut l Set) subset(r Set) bool { for e, _ in r.elements { if e !in l.elements { return false } } return true }