makepad_vector/internal_iter/
internal_iterator.rs1use crate::internal_iter::FromInternalIterator;
2
3pub trait InternalIterator {
9    type Item;
10
11    fn for_each<F>(self, f: &mut F) -> bool
16    where
17        F: FnMut(Self::Item) -> bool;
18
19    fn collect<F>(self) -> F
21    where
22        Self: Sized,
23        F: FromInternalIterator<Self::Item>,
24    {
25        FromInternalIterator::from_internal_iter(self)
26    }
27
28    fn map<R, F>(self, f: F) -> Map<Self, F>
30    where
31        Self: Sized,
32        F: FnMut(Self::Item) -> R,
33    {
34        Map {
35            internal_iter: self,
36            f,
37        }
38    }
39}
40
41impl<I> InternalIterator for I
42where
43    I: Iterator,
44{
45    type Item = I::Item;
46
47    fn for_each<F>(self, f: &mut F) -> bool
48    where
49        F: FnMut(Self::Item) -> bool,
50    {
51        for item in self {
52            if !f(item) {
53                return false;
54            }
55        }
56        true
57    }
58}
59
60#[derive(Clone, Debug)]
62pub struct Map<I, F> {
63    internal_iter: I,
64    f: F,
65}
66
67impl<R, I, F> InternalIterator for Map<I, F>
68where
69    I: InternalIterator,
70    F: FnMut(I::Item) -> R,
71{
72    type Item = R;
73
74    fn for_each<G>(mut self, g: &mut G) -> bool
75    where
76        G: FnMut(Self::Item) -> bool,
77    {
78        self.internal_iter.for_each({
79            let f = &mut self.f;
80            &mut move |item| g((f)(item))
81        })
82    }
83}