gat_lending_iterator/adapters/
cloned.rs1use std::ops::Deref;
2
3use crate::LendingIterator;
4
5#[derive(Clone, Debug)]
13#[must_use = "iterators are lazy and do nothing unless consumed"]
14pub struct Cloned<I> {
15 iter: I,
16}
17
18impl<I> Cloned<I> {
19 pub(crate) fn new(iter: I) -> Cloned<I> {
20 Cloned { iter }
21 }
22}
23
24impl<I> LendingIterator for Cloned<I>
25where
26 I: LendingIterator,
27 for<'a> I::Item<'a>: Deref,
28 for<'a> <I::Item<'a> as Deref>::Target: Clone,
29{
30 type Item<'a>
31 = <I::Item<'a> as Deref>::Target
32 where
33 Self: 'a;
34
35 fn next(&mut self) -> Option<Self::Item<'_>> {
36 self.iter.next().map(|item| item.deref().clone())
37 }
38}
39
40pub struct IntoIter<I> {
41 iter: I,
42}
43
44impl<I, T> Iterator for IntoIter<I>
45where
46 I: LendingIterator,
47 for<'a> I::Item<'a>: Deref<Target = T>,
48 T: Clone,
49{
50 type Item = T;
51
52 fn next(&mut self) -> Option<Self::Item> {
53 self.iter.next().map(|item| item.deref().clone())
54 }
55}
56
57impl<I, T> IntoIterator for Cloned<I>
58where
59 I: LendingIterator,
60 for<'a> I::Item<'a>: Deref<Target = T>,
61 T: Clone,
62{
63 type Item = T;
64 type IntoIter = IntoIter<I>;
65
66 fn into_iter(self) -> Self::IntoIter {
67 IntoIter { iter: self.iter }
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use crate::{LendingIterator, ToLendingIterator};
74
75 #[test]
76 fn cloned_basic() {
77 let data = vec![1, 2, 3];
78 let result: Vec<_> = data.lend_refs().cloned().into_iter().collect();
79 assert_eq!(result, vec![1, 2, 3]);
80 }
81}