summaryrefslogtreecommitdiff
path: root/src/single.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/single.rs')
-rw-r--r--src/single.rs24
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())
+ }
+}