diff options
Diffstat (limited to 'src/single.rs')
| -rw-r--r-- | src/single.rs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/single.rs b/src/single.rs new file mode 100644 index 0000000..b3f0b18 --- /dev/null +++ b/src/single.rs @@ -0,0 +1,24 @@ +pub trait Single { + type Item; + + fn single(self) -> Option<Self::Item>; +} + +impl<T, I> Single for I +where + I: IntoIterator<Item = T>, +{ + type Item = T; + + fn single(self) -> Option<Self::Item> { + 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()) + } +} |
