blob: 5d9c79538e371bc7de2475856dd9c0579fec244f [file]
use crate::intrinsics::type_id;
/// Collapses all unit items from an iterator into one.
///
/// This is more useful when combined with higher-level abstractions, like
/// collecting to a `Result<(), E>` where you only care about errors:
///
/// ```
/// use std::io::*;
/// let data = vec![1, 2, 3, 4, 5];
/// let res: Result<()> = data.iter()
/// .map(|x| writeln!(stdout(), "{x}"))
/// .collect();
/// assert!(res.is_ok());
/// ```
#[stable(feature = "unit_from_iter", since = "1.23.0")]
impl FromIterator<()> for () {
fn from_iter<I: IntoIterator<Item = ()>>(iter: I) -> Self {
iter.into_iter().for_each(|()| {})
}
}
pub(crate) trait IsUnit {
const IS_UNIT: bool;
}
impl<T: ?Sized> IsUnit for T {
// `type_id` erases lifetimes, but that's OK here because "is it ()" never depends on lifetimes
const IS_UNIT: bool = type_id::<Self>() == type_id::<()>();
}