1pub trait FractalIterator {
2 type Item;
3 fn for_each(self, f: &mut impl FnMut(Self::Item) -> bool) -> bool;
4 fn collect<F: FromFractalIterator<Self::Item>>(self) -> F
5 where
6 Self: Sized,
7 {
8 FromFractalIterator::from_internal_iter(self)
9 }
10}
11impl<I: Iterator> FractalIterator for I {
12 type Item = I::Item;
13 fn for_each(self, f: &mut impl FnMut(Self::Item) -> bool) -> bool {
14 for item in self {
15 if !f(item) {
16 return false;
17 }
18 }
19 true
20 }
21}
22
23pub trait IntoFractalIterator {
24 type Item;
25 type IntoInternalIter: FractalIterator<Item = Self::Item>;
26 fn into_internal_iter(self) -> Self::IntoInternalIter;
27}
28impl<I: FractalIterator> IntoFractalIterator for I {
29 type Item = <Self as FractalIterator>::Item;
30 type IntoInternalIter = Self;
31 fn into_internal_iter(self) -> Self::IntoInternalIter {
32 self
33 }
34}
35
36pub trait FromFractalIterator<T> {
37 fn from_internal_iter<I: IntoFractalIterator<Item = T>>(iter: I) -> Self;
38}
39impl<T> FromFractalIterator<T> for Vec<T> {
40 fn from_internal_iter<I: IntoFractalIterator<Item = T>>(iter: I) -> Self {
41 let mut vec = Vec::new();
42 iter.into_internal_iter().for_each(&mut |item| {
43 vec.push(item);
44 true
45 });
46 vec
47 }
48}
49
50