Skip to main content

glow_effects/util/
effect.rs

1use crate::util::color::ColorContainer;
2use crate::util::color_point::ColorPointContainer;
3
4pub trait Effect<U: ColorContainer, T: ColorPointContainer<U>> {
5    fn get_frame(&mut self) -> Vec<T>;
6
7    fn iter(&mut self) -> EffectIterator<U, T, Self> {
8        EffectIterator {
9            effect: self,
10            phantom_color_value: std::marker::PhantomData,
11            phantom_color_point: std::marker::PhantomData,
12        }
13    }
14}
15
16pub struct EffectIterator<
17    'a,
18    U: ColorContainer,
19    T: ColorPointContainer<U>,
20    E: Effect<U, T> + ?Sized,
21> {
22    effect: &'a mut E,
23    phantom_color_value: std::marker::PhantomData<U>,
24    phantom_color_point: std::marker::PhantomData<T>,
25}
26
27impl<'a, U: ColorContainer, T: ColorPointContainer<U>, E: Effect<U, T> + ?Sized> Iterator
28    for EffectIterator<'a, U, T, E>
29{
30    type Item = Vec<T>;
31
32    fn next(&mut self) -> Option<Self::Item> {
33        Some(self.effect.get_frame())
34    }
35}