use crate::geometries::{
    Contour, Multipolygon, Multisegment, Polygon, Segment,
};
use crate::traits::Difference;

use super::types::Empty;

impl<Scalar> Difference<Contour<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: Contour<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<&Contour<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: &Contour<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<Contour<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: Contour<Scalar>) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<&Contour<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: &Contour<Scalar>) -> Self::Output {
        *self
    }
}

impl Difference for Empty {
    type Output = Self;

    fn difference(self, _other: Self) -> Self::Output {
        self
    }
}

impl Difference<&Self> for Empty {
    type Output = Self;

    fn difference(self, _other: &Self) -> Self::Output {
        self
    }
}

impl Difference<Empty> for &Empty {
    type Output = Empty;

    fn difference(self, _other: Empty) -> Self::Output {
        *self
    }
}

impl Difference for &Empty {
    type Output = Empty;

    fn difference(self, _other: Self) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<Multipolygon<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: Multipolygon<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<&Multipolygon<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: &Multipolygon<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<Multipolygon<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: Multipolygon<Scalar>) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<&Multipolygon<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: &Multipolygon<Scalar>) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<Multisegment<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: Multisegment<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<&Multisegment<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: &Multisegment<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<Multisegment<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: Multisegment<Scalar>) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<&Multisegment<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: &Multisegment<Scalar>) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<Polygon<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: Polygon<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<&Polygon<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: &Polygon<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<Polygon<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: Polygon<Scalar>) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<&Polygon<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: &Polygon<Scalar>) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<Segment<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: Segment<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<&Segment<Scalar>> for Empty {
    type Output = Self;

    fn difference(self, _other: &Segment<Scalar>) -> Self::Output {
        self
    }
}

impl<Scalar> Difference<Segment<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: Segment<Scalar>) -> Self::Output {
        *self
    }
}

impl<Scalar> Difference<&Segment<Scalar>> for &Empty {
    type Output = Empty;

    fn difference(self, _other: &Segment<Scalar>) -> Self::Output {
        *self
    }
}
