reliq 0.3.6

A portable library of primitive-like constructs.
Documentation
#[inline]
pub fn require<A, B, C, D>(state: &mut A, on_transaction: B) -> Result<C, D>
where
    A: Clone,
    B: FnOnce(&mut A) -> Result<C, D> {
    let snapshot: A = state.clone();
    match on_transaction(state) {
        Ok(ret) => Ok(ret),
        Err(e) => {
            *state = snapshot;
            Err(e)
        }
    }
}

#[inline]
pub fn retry<A, B, C>(attempts: usize, mut on_attempt: A) -> Result<B, C> 
where
    A: FnMut(usize) -> Result<B, C> {
    let mut last_failure: Option<C> = None;
    for attempt in 0..=attempts {
        match on_attempt(attempt) {
            Ok(ret) => return Ok(ret),
            Err(e) => last_failure = Some(e)
        }
    }
    let last_failure: C = unsafe {
        last_failure.unwrap_unchecked()
    };
    Err(last_failure)
}