use futures::Future;
use tokio::sync::Mutex;
#[derive(Debug)]
pub struct UpdateMerge {
last_failed: Mutex<bool>,
}
impl Default for UpdateMerge {
fn default() -> Self {
Self {
last_failed: Mutex::new(false),
}
}
}
impl UpdateMerge {
pub async fn merge<E>(&self, fut: impl Future<Output = Result<(), E>>) -> Result<(), E> {
let mut guard = if let Ok(guard) = self.last_failed.try_lock() {
guard
} else {
let guard = self.last_failed.lock().await;
if *guard {
guard
} else {
return Ok(());
}
};
*guard = true;
let result = fut.await;
*guard = result.is_err();
result
}
}
#[cfg(test)]
mod tests;