gat_lending_iterator/adapters/
cloned.rs

1use std::ops::Deref;
2
3use crate::LendingIterator;
4
5/// A lending iterator that clones the elements of an underlying lending iterator.
6///
7/// This `struct` is created by the [`cloned`] method on [`LendingIterator`]. See
8/// its documentation for more.
9///
10/// [`LendingIterator`]: crate::LendingIterator
11/// [`cloned`]: crate::LendingIterator::cloned
12#[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}