diff --git a/src/iter.rs b/src/iter.rs new file mode 100644 index 0000000..88be085 --- /dev/null +++ b/src/iter.rs @@ -0,0 +1,22 @@ +use std::convert::identity; + +pub(crate) fn loop_list(iter: impl IntoIterator) -> impl Iterator { + loop_list_ex(iter, identity, identity) +} + +pub(crate) fn loop_list_ex( + iter: impl IntoIterator, + mut fa: impl FnMut(T) -> U, + mut fb: impl FnMut(T) -> U, +) -> impl Iterator { + gen move { + let mut iter = iter.into_iter(); + let Some(first) = iter.next() else { return }; + yield fa(first.clone()); + for item in iter { + yield fb(item.clone()); + yield fa(item); + } + yield fb(first); + } +} diff --git a/src/lib.rs b/src/lib.rs index 0873c0b..99e79e9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,13 @@ #![feature(gen_blocks)] -use std::{convert::identity, error::Error, f32::consts::PI}; +use std::{error::Error, f32::consts::PI}; use glam::{Mat4, UVec2, Vec2, Vec3, vec3}; use rand_distr::Distribution as _; use crate::{ camera::OrbitalCamera, + iter::loop_list, ray::Ray, render::{ DEPTH_FORMAT, OUTPUT_FORMAT, @@ -118,27 +119,6 @@ pub fn new_tripod(device: &wgpu::Device) -> Mesh { ) } -fn loop_list(iter: impl IntoIterator) -> impl Iterator { - loop_list_ex(iter, identity, identity) -} - -fn loop_list_ex( - iter: impl IntoIterator, - mut fa: impl FnMut(T) -> U, - mut fb: impl FnMut(T) -> U, -) -> impl Iterator { - gen move { - let mut iter = iter.into_iter(); - let Some(first) = iter.next() else { return }; - yield fa(first.clone()); - for item in iter { - yield fb(item.clone()); - yield fa(item); - } - yield fb(first); - } -} - impl OrbitalCamera { fn make_ray(&self, rng: &mut impl rand::Rng) -> Ray { let off: f32 = rand_distr::StandardUniform.sample(rng);