pub trait Single { type Item; fn single(self) -> Option; } impl Single for I where I: IntoIterator, { type Item = T; fn single(self) -> Option { let mut iter = self.into_iter(); // There are three cases of interest: // // 1. `self` has zero items -> return None. // 2. `self` has two or more items -> return None. // 3. `self` has exactly one item -> return `iter.next()` unchanged, as // it holds that item. iter.next().filter(|_| iter.next().is_none()) } }