1pub use derive_refineable::Refineable;
2
3pub trait Refineable: Clone {
4 type Refinement: Refineable<Refinement = Self::Refinement> + 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 struct Cascade<S: Refineable>(Vec<Option<S::Refinement>>);
17
18impl<S: Refineable + Default> Default for Cascade<S> {
19 fn default() -> Self {
20 Self(vec![Some(Default::default())])
21 }
22}
23
24#[derive(Copy, Clone)]
25pub struct CascadeSlot(usize);
26
27impl<S: Refineable + Default> Cascade<S> {
28 pub fn reserve(&mut self) -> CascadeSlot {
29 self.0.push(None);
30 CascadeSlot(self.0.len() - 1)
31 }
32
33 pub fn base(&mut self) -> &mut S::Refinement {
34 self.0[0].as_mut().unwrap()
35 }
36
37 pub fn set(&mut self, slot: CascadeSlot, refinement: Option<S::Refinement>) {
38 self.0[slot.0] = refinement
39 }
40
41 pub fn merged(&self) -> S::Refinement {
42 let mut merged = self.0[0].clone().unwrap();
43 for refinement in self.0.iter().skip(1).flatten() {
44 merged.refine(refinement);
45 }
46 merged
47 }
48}