import vec import io import serialize fun set(): set { var toRet.construct() : set return toRet } fun set(item: T): set { var toRet.construct() : set toRet.add(item) return toRet } fun from_vector(items: vec::vec): set { var toRet.construct() : set items.for_each( fun(item: T) toRet.add(item); ) return toRet } obj set (Object, Serializable) { var data: vec::vec fun construct(): *set { data.construct() return this } fun construct(ammt: int): *set { data.construct(ammt) return this } fun copy_construct(old: *set) { data.copy_construct(&old->data) } fun operator=(rhs: ref set) { data = rhs.data } fun serialize(): vec::vec { return serialize::serialize(data) } fun unserialize(it: ref vec::vec, pos: int): int { return data.unserialize(it, pos) } fun operator==(rhs: ref set): bool { if (size() != rhs.size()) return false return !data.any_true( fun(item: T): bool return !rhs.contains(item); ) } fun operator!=(rhs: ref set): bool { return ! (*this == rhs) } fun destruct() { data.destruct() } fun size():int { return data.size } fun contains(items: ref set): bool { return items.size() == 0 || !items.any_true( fun(item: T): bool return !contains(item); ) } fun contains(item: ref T): bool { return data.find(item) != -1 } fun operator+=(item: ref T) { add(item) } fun operator+=(items: ref set) { add(items) } fun operator+(item: ref T): set { var to_ret.copy_construct(this): set to_ret.add(item) return to_ret } fun operator+(items: ref set): set { var to_ret.copy_construct(this): set to_ret.add(items) return to_ret } fun add(item: ref T) { if (!contains(item)) data.add(item) } fun add_all(items: ref set) { add(items) } fun add(items: ref set) { items.for_each( fun(item: ref T) add(item); ) } fun add(items: ref vec::vec) { items.for_each( fun(item: ref T) add(item); ) } fun remove(item: ref T) { var idx = data.find(item) if (idx == -1) { /*io::println("CANNOT FIND ITEM TO REMOVE")*/ return } data.remove(idx) } fun for_each(func: fun(ref T):void) { data.for_each(func) } fun for_each(func: fun(T):void) { data.for_each(func) } fun any_true(func: fun(T):bool):bool { return data.any_true(func) } fun reduce(func: fun(T,U): U, initial: U): U { return data.reduce(func, initial) } fun map(func: fun(T):U):set { var newSet.construct(size()): set for (var i = 0; i < size(); i++;) newSet.add(func(data[i])) return newSet } fun flatten_map(func: fun(T):set):set { var newSet.construct(size()): set for (var i = 0; i < size(); i++;) func(data[i]).for_each(fun(item: ref U) newSet.add(item);) return newSet } fun filter(func: fun(T):bool):set { var newSet.construct(): set newSet.data = data.filter(func) return newSet } fun chaotic_closure(func: fun(T): set) { var prev_size = 0 while (prev_size != data.size) { prev_size = data.size for (var i = 0; i < data.size; i++;) add(func(data[i])) } } }