use super::*;
impl<T: Clone + PartialEq + Default + 'static> DebouncedValue<T> {
pub fn set(&self, next: T, now_ms: u64) {
self.get_state().set(DebounceState::Pending(now_ms, next));
}
pub fn tick(&self, now_ms: u64) -> bool {
match self.get_state().get() {
DebounceState::Idle => false,
DebounceState::Pending(set_at, _) => {
if now_ms.saturating_sub(set_at) >= u64::from(self.delay_ms) {
let pending: T = match self.get_state().get() {
DebounceState::Pending(_, value) => value,
DebounceState::Idle => unreachable!(),
};
self.get_value().set(pending);
self.get_state().set(DebounceState::Idle);
true
} else {
false
}
}
}
}
pub fn cancel(&self) {
self.get_state().set(DebounceState::Idle);
}
pub fn get(&self) -> T {
self.get_value().get()
}
pub fn is_pending(&self) -> bool {
matches!(self.get_state().get(), DebounceState::Pending(_, _))
}
}
impl<T: Clone + PartialEq + Debug + Default + 'static> Display for DebouncedValue<T> {
fn fmt(&self, formatter: &mut Formatter<'_>) -> FmtResult {
let pending: &DebounceState<T> = &self.get_state().get();
match pending {
DebounceState::Idle => {
write!(formatter, "DebouncedValue({:?})", self.get_value().get())
}
DebounceState::Pending(_, value) => {
write!(formatter, "DebouncedValue(pending={value:?})")
}
}
}
}