conspire 0.7.1

The Rust interface to conspire.
Documentation
#[cfg(test)]
pub mod test;

use crate::{
    geometry::bbox::{BoundingBox, Unite},
    math::Tensor,
};

impl<const D: usize> Unite<Self> for BoundingBox<D> {
    type Output = Self;
    fn unite(self, other: Self) -> Self::Output {
        let mut minimum = self.minimum;
        let mut maximum = self.maximum;
        minimum
            .iter_mut()
            .zip(other.minimum)
            .zip(maximum.iter_mut().zip(other.maximum))
            .for_each(|((min, other_min), (max, other_max))| {
                *min = min.min(other_min);
                *max = max.max(other_max);
            });
        Self { minimum, maximum }
    }
}

impl<const D: usize> Unite<BoundingBox<D>> for &BoundingBox<D> {
    type Output = BoundingBox<D>;
    fn unite(self, other: BoundingBox<D>) -> Self::Output {
        let mut minimum = self.minimum.clone();
        let mut maximum = self.maximum.clone();
        minimum
            .iter_mut()
            .zip(other.minimum)
            .zip(maximum.iter_mut().zip(other.maximum))
            .for_each(|((min, other_min), (max, other_max))| {
                *min = min.min(other_min);
                *max = max.max(other_max);
            });
        BoundingBox { minimum, maximum }
    }
}

impl<const D: usize> Unite<&Self> for BoundingBox<D> {
    type Output = Self;
    fn unite(self, other: &Self) -> Self::Output {
        let mut minimum = self.minimum;
        let mut maximum = self.maximum;
        minimum
            .iter_mut()
            .zip(other.minimum.iter())
            .zip(maximum.iter_mut().zip(other.maximum.iter()))
            .for_each(|((min, &other_min), (max, &other_max))| {
                *min = min.min(other_min);
                *max = max.max(other_max);
            });
        Self { minimum, maximum }
    }
}

impl<const D: usize> Unite<Self> for &BoundingBox<D> {
    type Output = BoundingBox<D>;
    fn unite(self, other: Self) -> Self::Output {
        let mut minimum = self.minimum.clone();
        let mut maximum = self.maximum.clone();
        minimum
            .iter_mut()
            .zip(other.minimum.iter())
            .zip(maximum.iter_mut().zip(other.maximum.iter()))
            .for_each(|((min, &other_min), (max, &other_max))| {
                *min = min.min(other_min);
                *max = max.max(other_max);
            });
        BoundingBox { minimum, maximum }
    }
}