diff --git a/examples/Iter_example.rs b/examples/Iter_example.rs new file mode 100644 index 0000000..0d201b1 --- /dev/null +++ b/examples/Iter_example.rs @@ -0,0 +1,28 @@ +use tagged_core::Tagged; + +#[derive(Debug)] +struct Org; + +type EmployeeNames = Tagged, Org>; + +fn main() { + let names: EmployeeNames = Tagged::new(vec!["Alice".into(), "Bob".into()]); + + for name in &names { + println!("Name: {name}"); + } + + // Consuming iterator + for name in names { + println!("Owned: {name}"); + } +} + +/* +Name: Alice +Name: Bob +Owned: Alice +Owned: Bob + +Process finished with exit code 0 +*/ \ No newline at end of file diff --git a/tagged-core/src/lib.rs b/tagged-core/src/lib.rs index 901f598..1f160f8 100644 --- a/tagged-core/src/lib.rs +++ b/tagged-core/src/lib.rs @@ -140,6 +140,24 @@ impl<'de, T: Deserialize<'de>, Tag> Deserialize<'de> for Tagged { } } +impl IntoIterator for Tagged, Tag> { + type Item = T; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.value.into_iter() + } +} + +impl<'a, T, Tag> IntoIterator for &'a Tagged, Tag> { + type Item = &'a T; + type IntoIter = std::slice::Iter<'a, T>; + + fn into_iter(self) -> Self::IntoIter { + self.value.iter() + } +} + // For all common primitive types // macro_rules! impl_from_tagged { // ($($t:ty),*) => {