use rand::Rng; use crate::system::{GriddedPosition, Position, Storage}; pub trait Sticker> { fn should_stick(&self, rng: &mut R, space: &S, position: &P) -> bool; } pub struct SimpleSticking; pub struct ProbabilisticSticking { pub stick_probability: f32 } impl> Sticker for SimpleSticking { fn should_stick(&self, _rng: &mut R, space: &S, position: &P) -> bool { (0..P::NEIGHBOURS) .map(|n| position.neighbour(n)) .any(|neighbour| space.is_occupied(&neighbour)) } } impl> Sticker for ProbabilisticSticking { fn should_stick(&self, rng: &mut R, space: &S, position: &P) -> bool { (0..P::NEIGHBOURS) .map(|n| position.neighbour(n)) .any(|neighbour| space.is_occupied(&neighbour) && rng.gen_range(0.0f32..=1.0) < self.stick_probability) } }