Skip to main content

grafix_toolbox/kit/policies/func/
n_iter.rs

1#![allow(private_bounds)]
2use crate::lib::*;
3
4pub fn iter2d<T: Rangeable>(args: impl IterArgs2d<T>) -> impl Iterator<Item = vec2<T>> {
5	let (wr, h) = args.get();
6	let (mut x, w, mut y, h) = (wr.start, wr.end, h.start, h.end);
7	let ident = T::to(1);
8	iter::from_fn(move || {
9		if y >= h {
10			None?
11		}
12		let ret = Some((x, y));
13
14		x += ident;
15		if x >= w {
16			x = wr.start;
17			y += ident;
18		}
19		ret
20	})
21}
22
23pub fn iter3d<T: Rangeable>(args: impl IterArgs3d<T>) -> impl Iterator<Item = vec3<T>> {
24	let (wr, hr, d) = args.get();
25	let (mut x, w, mut y, h, mut z, d) = (wr.start, wr.end, hr.start, hr.end, d.start, d.end);
26	let ident = T::to(1);
27	iter::from_fn(move || {
28		if z >= d {
29			None?
30		}
31		let ret = Some((x, y, z));
32
33		x += ident;
34		if x >= w {
35			x = wr.start;
36			y += ident;
37		}
38		if y >= h {
39			y = hr.start;
40			z += ident;
41		}
42		ret
43	})
44}
45
46type Args2d<T> = (R<T>, R<T>);
47trait IterArgs2d<T> {
48	fn get(self) -> Args2d<T>;
49}
50impl<T> IterArgs2d<T> for Args2d<T> {
51	fn get(self) -> Self {
52		self
53	}
54}
55impl<T: Rangeable> IterArgs2d<T> for R<T> {
56	fn get(self) -> Args2d<T> {
57		(self.clone(), self)
58	}
59}
60impl<S: Rangeable> IterArgs2d<S> for S {
61	fn get(self) -> Args2d<S> {
62		(Def()..self, Def()..self)
63	}
64}
65impl<T: Rangeable> IterArgs2d<T> for (T, T) {
66	fn get(self) -> Args2d<T> {
67		(Def()..self.0, Def()..self.1)
68	}
69}
70
71type Args3d<T> = (R<T>, R<T>, R<T>);
72trait IterArgs3d<T> {
73	fn get(self) -> Args3d<T>;
74}
75impl<T> IterArgs3d<T> for Args3d<T> {
76	fn get(self) -> Self {
77		self
78	}
79}
80impl<T: Rangeable> IterArgs3d<T> for R<T> {
81	fn get(self) -> Args3d<T> {
82		(self.clone(), self.clone(), self)
83	}
84}
85impl<S: Rangeable> IterArgs3d<S> for S {
86	fn get(self) -> Args3d<S> {
87		(Def()..self, Def()..self, Def()..self)
88	}
89}
90impl<T: Rangeable> IterArgs3d<T> for (T, T, T) {
91	fn get(self) -> Args3d<T> {
92		(Def()..self.0, Def()..self.1, Def()..self.2)
93	}
94}
95
96type R<T> = ops::Range<T>;
97trait_alias!(Rangeable, Default + ops::AddAssign + Copy + PartialOrd + Cast<u32>);