#![no_std]
#[cfg(feature = "std")]
extern crate std;
pub mod revref;
pub mod dropref;
pub use revref::{RevMut, RevertCheck};
pub use dropref::DropMut;
pub fn replace<T, U>(data: &mut T, update: impl FnOnce(T) -> (T, U)) -> U {
let data = &raw mut *data;
unsafe {
let (new, side) = update(data.read());
data.write(new);
side
}
}
pub async fn replace_async<T, U>(data: &mut T, update: impl AsyncFnOnce(T) -> (T, U)) -> U {
let data = &raw mut *data;
unsafe {
let (new, side) = update(data.read()).await;
data.write(new);
side
}
}