shape-runtime 0.3.0

Bytecode compiler, builtins, and runtime infrastructure for Shape
Documentation
/// @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.includes(s, item), set.union(a, b), set.intersection(a, b),
///          set.difference(a, b), set.to_array(s), set.len(s)
///
/// Criterion F (2026-05-22): `set.contains(s, item)` was renamed to
/// `set.includes(s, item)` and `set.size(s)` was renamed to `set.len(s)`
/// to standardize the membership/length-naming surface across
/// Array/Set/HashMap. No backwards-compat aliases shipped.

/// 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 includes an item (criterion F: renamed from `contains`).
pub fn includes(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 (criterion F: renamed from `size`).
pub fn len(s) {
    s.len()
}