pub trait Empty {
fn empty() -> Self;
}
#[cfg(feature = "derive")]
pub use leer_macros::Empty;
macro_rules! impl_empty_via_default {
($( { $($impl_header:tt)+ } ,)*) => {
$(
$($impl_header)* {
fn empty() -> Self {
Self::default()
}
}
)*
}
}
impl_empty_via_default!(
{ impl Empty for () },
{ impl<T: ?Sized> Empty for std::marker::PhantomData<T> },
{ impl<T> Empty for Option<T> },
{ impl Empty for String },
{ impl<T> Empty for Vec<T> },
{ impl<T: Ord> Empty for std::collections::BTreeSet<T> },
{ impl<T: Eq + std::hash::Hash> Empty for std::collections::HashSet<T> },
{ impl<T> Empty for std::collections::LinkedList<T> },
{ impl<T> Empty for std::collections::VecDeque<T> },
{ impl<K: Ord, V> Empty for std::collections::BTreeMap<K, V> },
{ impl<K: Eq + std::hash::Hash, V> Empty for std::collections::HashMap<K, V> },
);
impl<T: Empty> Empty for Box<T> {
fn empty() -> Self {
Box::new(T::empty())
}
}
impl<A: Empty> Empty for (A,) {
fn empty() -> Self { (A::empty(),) }
}
impl<A: Empty, B: Empty> Empty for (A, B) {
fn empty() -> Self { (A::empty(), B::empty()) }
}
impl<A: Empty, B: Empty, C: Empty> Empty for (A, B, C) {
fn empty() -> Self { (A::empty(), B::empty(), C::empty()) }
}
impl<A: Empty, B: Empty, C: Empty, D: Empty> Empty for (A, B, C, D) {
fn empty() -> Self { (A::empty(), B::empty(), C::empty(), D::empty()) }
}
impl<T: Empty, const N: usize> Empty for [T; N] {
fn empty() -> Self {
std::array::from_fn(|_| T::empty())
}
}