mathrc 0.2.5

Rust Mathematics Library
Documentation
#[derive(Debug, Clone)]
pub struct Set<T>
where
    T: PartialEq + Clone,
{
    elements: Vec<T>,
}

impl<T> Default for Set<T>
where
    T: PartialEq + Clone,
{
    fn default() -> Self {
        Self::new()
    }
}

impl<T> Set<T>
where
    T: PartialEq + Clone,
{
    pub fn new() -> Self {
        Self {
            elements: Vec::new(),
        }
    }

    pub fn insert(&mut self, value: T) {
        if !self.contains(&value) {
            self.elements.push(value);
        }
    }

    pub fn remove(&mut self, value: &T) -> bool {
        if let Some(index) = self.elements.iter().position(|x| x == value) {
            self.elements.remove(index);
            return true;
        }

        false
    }

    pub fn contains(&self, value: &T) -> bool {
        self.elements.contains(value)
    }

    pub fn union(&self, other: &Self) -> Self {
        let mut result = self.clone();

        for value in &other.elements {
            result.insert(value.clone());
        }

        result
    }

    pub fn intersection(&self, other: &Self) -> Self {
        let mut result = Self::new();

        for value in &self.elements {
            if other.contains(value) {
                result.insert(value.clone());
            }
        }

        result
    }

    pub fn difference(&self, other: &Self) -> Self {
        let mut result = Self::new();

        for value in &self.elements {
            if !other.contains(value) {
                result.insert(value.clone());
            }
        }

        result
    }

    pub fn is_subset(&self, other: &Self) -> bool {
        self.elements.iter().all(|x| other.contains(x))
    }

    pub fn len(&self) -> usize {
        self.elements.len()
    }

    pub fn is_empty(&self) -> bool {
        self.elements.is_empty()
    }

    pub fn clear(&mut self) {
        self.elements.clear();
    }

    pub fn iter(&self) -> std::slice::Iter<'_, T> {
        self.elements.iter()
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_set() {
        let mut a = Set::new();
        a.insert(1);
        a.insert(2);
        a.insert(3);

        let mut b = Set::new();
        b.insert(3);
        b.insert(4);
        b.insert(5);

        assert!(a.contains(&1));
        assert!(!a.contains(&4));

        assert_eq!(a.union(&b).len(), 5);
        assert_eq!(a.intersection(&b).len(), 1);
        assert_eq!(a.difference(&b).len(), 2);

        assert!(Set::<i32>::new().is_subset(&a));
    }
}