grafix_toolbox/kit/policies/func/
n_iter.rs1#![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>);