/// @module std::core::set
/// Set module - unordered collection of unique elements
///
/// Backed by HashMap for O(1) lookup.
/// Exports: set.new(), set.from_array(arr), set.add(s, item), set.remove(s, item),
/// set.contains(s, item), set.union(a, b), set.intersection(a, b),
/// set.difference(a, b), set.to_array(s), set.size(s)
/// Create a new empty set
pub fn new() {
HashMap()
}
/// Create a set from an array (deduplicates)
pub fn from_array(arr) {
var s = HashMap()
for item in arr {
s = s.set(item, true)
}
s
}
/// Add an item to the set, returns new set
pub fn add(s, item) {
s.set(item, true)
}
/// Remove an item from the set, returns new set
pub fn remove(s, item) {
s.delete(item)
}
/// Check if set contains an item
pub fn contains(s, item) {
s.has(item)
}
/// Union of two sets
pub fn union(a, b) {
var result = a
for key in b.keys() {
result = result.set(key, true)
}
result
}
/// Intersection of two sets
pub fn intersection(a, b) {
var result = HashMap()
for key in a.keys() {
if b.has(key) {
result = result.set(key, true)
}
}
result
}
/// Difference (a - b)
pub fn difference(a, b) {
var result = HashMap()
for key in a.keys() {
if !b.has(key) {
result = result.set(key, true)
}
}
result
}
/// Convert set to array
pub fn to_array(s) {
s.keys()
}
/// Get the number of elements
pub fn size(s) {
s.len()
}