use std::sync::Mutex;
#[doc(hidden)]
#[derive(Default)]
pub struct EventSequence(Mutex<u16>);
impl EventSequence {
pub fn transaction<R, E>(
&self,
prepare_commit: impl FnOnce(u16) -> Result<R, E>,
) -> Result<R, E> {
let mut number = self.0.lock().unwrap();
let value = prepare_commit(*number)?;
*number = number.wrapping_add(1);
Ok(value)
}
pub fn transaction_many<R, E>(
&self,
count: u16,
prepare_commit: impl FnOnce(u16) -> Result<R, E>,
) -> Result<R, E> {
let mut number = self.0.lock().unwrap();
let result = prepare_commit(*number)?;
*number = number.wrapping_add(count);
Ok(result)
}
pub(super) fn current(&self) -> u16 {
*self.0.lock().unwrap()
}
pub(super) fn confirm(&self, expected: u16) -> bool {
let mut number = self.0.lock().unwrap();
if *number != expected {
return false;
}
*number = number.wrapping_add(1);
true
}
}