use crate::patterns::{Pattern, PixelColor}; use crate::{impl_pattern_none, Strip}; use serde::{Deserialize, Serialize}; /// # FillRandom /// /// fill strip with color then apply random variation to each pixel #[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)] pub struct FillRandom { pub(crate) color: PixelColor, pub(crate) stability: usize, pub(crate) max_iteration: Option, #[serde(default)] pub(crate) current_iteration: usize, } impl Pattern for FillRandom { impl_pattern_none!(FadeRandom, N); } impl Iterator for FillRandom { type Item = Strip; fn next(&mut self) -> Option { if self.is_last_iteration() { return None; } let mut strip = Strip::::default(); let rng = rand::thread_rng(); for i in 0..N { let c = self.color.random_delta(self.stability, &mut rng.clone()); strip[i] = Some(c); } self.current_iteration += 1; Some(strip) } }