treereduce 0.4.1

Fast, syntax-aware, multi-language program reducer based on delta debugging
Documentation
#[derive(Clone, Debug)]
pub(crate) struct Versioned<T> {
    value: T,
    version: usize,
}

impl<T> Versioned<T> {
    pub(crate) fn extract(self) -> T {
        self.value
    }

    pub(crate) fn get(&self) -> &T {
        &self.value
    }

    fn _mutate<F: FnOnce(T) -> T>(mut self, f: F) {
        self.value = f(self.value);
        self.inc();
    }

    pub(crate) fn mutate_clone<F: FnOnce(T) -> T>(&self, f: F) -> Self
    where
        T: Clone,
    {
        let mut r = (*self).clone();
        r.value = f(r.value);
        let ret = r.inc();
        debug_assert!(self.old_version(&ret));
        ret
    }

    pub(crate) fn new(value: T) -> Self {
        Versioned { value, version: 0 }
    }

    pub(crate) fn inc(self) -> Self {
        Versioned {
            value: self.value,
            version: self.version + 1,
        }
    }

    fn _modify(&self, value: T) -> Self {
        Versioned {
            value,
            version: self.version + 1,
        }
    }

    pub(crate) fn old_version(&self, other: &Versioned<T>) -> bool {
        self.version + 1 == other.version
    }

    fn _same_version(&self, other: &Versioned<T>) -> bool {
        self.version == other.version
    }
}