use std::cell::Cell;
use std::time::Instant;
thread_local! {
static START_PRE_TRADE_NOW: Cell<Option<Instant>> = const { Cell::new(None) };
}
struct StartPreTradeNowGuard<'a> {
slot: &'a Cell<Option<Instant>>,
previous: Option<Instant>,
}
impl Drop for StartPreTradeNowGuard<'_> {
fn drop(&mut self) {
self.slot.set(self.previous);
}
}
pub(crate) fn with_start_pre_trade_now<T>(now: Instant, f: impl FnOnce() -> T) -> T {
START_PRE_TRADE_NOW.with(|slot| {
let previous = slot.replace(Some(now));
let _guard = StartPreTradeNowGuard { slot, previous };
f()
})
}
pub(crate) fn start_pre_trade_now() -> Instant {
START_PRE_TRADE_NOW
.with(|slot| slot.get())
.unwrap_or_else(Instant::now)
}