Piotr OsiewiczAnother batch of fixupsa3759f92 years agoHistory
48 lines · 1.3 KB · Rust
RawDownload
pub use derive_refineable::Refineable; pub trait Refineable: Clone {    type Refinement: Refineable<Refinement = Self::Refinement> + Default;     fn refine(&mut self, refinement: &Self::Refinement);    fn refined(self, refinement: Self::Refinement) -> Self;    fn from_cascade(cascade: &Cascade<Self>) -> Self    where        Self: Default + Sized,    {        Self::default().refined(cascade.merged())    }} pub struct Cascade<S: Refineable>(Vec<Option<S::Refinement>>); impl<S: Refineable + Default> Default for Cascade<S> {    fn default() -> Self {        Self(vec![Some(Default::default())])    }} #[derive(Copy, Clone)]pub struct CascadeSlot(usize); impl<S: Refineable + Default> Cascade<S> {    pub fn reserve(&mut self) -> CascadeSlot {        self.0.push(None);        CascadeSlot(self.0.len() - 1)    }     pub fn base(&mut self) -> &mut S::Refinement {        self.0[0].as_mut().unwrap()    }     pub fn set(&mut self, slot: CascadeSlot, refinement: Option<S::Refinement>) {        self.0[slot.0] = refinement    }     pub fn merged(&self) -> S::Refinement {        let mut merged = self.0[0].clone().unwrap();        for refinement in self.0.iter().skip(1).flatten() {            merged.refine(refinement);        }        merged    }}