tessor/
iter.rs

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// pub trait ExtendFromInternalIterator<T> {
51// 	/// Extends `self` with each item of `internal_iter`.
52// 	fn extend_from_internal_iter<I>(&mut self, internal_iter: I)
53// 	where
54// 		I: IntoInternalIterator<Item = T>;
55// }
56
57// impl<T> ExtendFromInternalIterator<T> for Vec<T> {
58// 	fn extend_from_internal_iter<I>(&mut self, internal_iter: I)
59// 	where
60// 		I: IntoInternalIterator<Item = T>,
61// 	{
62// 		internal_iter.into_internal_iter().for_each(&mut |item| {
63// 			self.push(item);
64// 			true
65// 		});
66// 	}
67// }