refineable.rs

 1pub use derive_refineable::Refineable;
 2
 3pub trait Refineable: Clone {
 4    type Refinement: Refineable<Refinement = Self::Refinement> + IsEmpty + Default;
 5
 6    fn refine(&mut self, refinement: &Self::Refinement);
 7    fn refined(self, refinement: Self::Refinement) -> Self;
 8    fn from_cascade(cascade: &Cascade<Self>) -> Self
 9    where
10        Self: Default + Sized,
11    {
12        Self::default().refined(cascade.merged())
13    }
14}
15
16pub trait IsEmpty {
17    /// When `true`, indicates that use applying this refinement does nothing.
18    fn is_empty(&self) -> bool;
19}
20
21pub struct Cascade<S: Refineable>(Vec<Option<S::Refinement>>);
22
23impl<S: Refineable + Default> Default for Cascade<S> {
24    fn default() -> Self {
25        Self(vec![Some(Default::default())])
26    }
27}
28
29#[derive(Copy, Clone)]
30pub struct CascadeSlot(usize);
31
32impl<S: Refineable + Default> Cascade<S> {
33    pub fn reserve(&mut self) -> CascadeSlot {
34        self.0.push(None);
35        CascadeSlot(self.0.len() - 1)
36    }
37
38    pub fn base(&mut self) -> &mut S::Refinement {
39        self.0[0].as_mut().unwrap()
40    }
41
42    pub fn set(&mut self, slot: CascadeSlot, refinement: Option<S::Refinement>) {
43        self.0[slot.0] = refinement
44    }
45
46    pub fn merged(&self) -> S::Refinement {
47        let mut merged = self.0[0].clone().unwrap();
48        for refinement in self.0.iter().skip(1).flatten() {
49            merged.refine(refinement);
50        }
51        merged
52    }
53}