aboutsummaryrefslogtreecommitdiff
path: root/macros/src/util/iterator_ext.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/util/iterator_ext.rs')
-rw-r--r--macros/src/util/iterator_ext.rs57
1 files changed, 56 insertions, 1 deletions
diff --git a/macros/src/util/iterator_ext.rs b/macros/src/util/iterator_ext.rs
index 86db6cb..5001068 100644
--- a/macros/src/util/iterator_ext.rs
+++ b/macros/src/util/iterator_ext.rs
@@ -9,7 +9,7 @@ pub trait IteratorExt<Item>
impl<Iter> IteratorExt<Iter::Item> for Iter
where
Iter: Iterator,
- Iter::Item: Eq + Hash + Copy,
+ Iter::Item: Eq + Hash + Clone,
{
fn find_duplicate(&mut self) -> Option<Iter::Item>
{
@@ -26,3 +26,58 @@ where
None
}
}
+
+#[cfg(test)]
+mod tests
+{
+ use super::*;
+
+ #[test]
+ fn can_find_duplicate()
+ {
+ #[derive(Debug, PartialEq, Eq, Clone, Hash)]
+ struct Fruit
+ {
+ name: String,
+ }
+
+ assert_eq!(
+ vec![
+ Fruit {
+ name: "Apple".to_string(),
+ },
+ Fruit {
+ name: "Banana".to_string(),
+ },
+ Fruit {
+ name: "Apple".to_string(),
+ },
+ Fruit {
+ name: "Orange".to_string(),
+ },
+ ]
+ .iter()
+ .find_duplicate(),
+ Some(&Fruit {
+ name: "Apple".to_string()
+ })
+ );
+
+ assert_eq!(
+ vec![
+ Fruit {
+ name: "Banana".to_string(),
+ },
+ Fruit {
+ name: "Apple".to_string(),
+ },
+ Fruit {
+ name: "Orange".to_string(),
+ },
+ ]
+ .iter()
+ .find_duplicate(),
+ None
+ );
+ }
+}