use std::collections::HashSet;
use std::hash::Hash;
#[derive(Debug)]
pub struct DigitalInput<T> {
activated: HashSet<T>,
just_activated: HashSet<T>,
just_deactivated: HashSet<T>,
}
impl<T> DigitalInput<T>
where
T: Hash + Eq,
{
pub fn activated(&self, input: T) -> bool {
self.activated.contains(&input)
}
pub fn just_activated(&self, input: T) -> bool {
self.just_activated.contains(&input)
}
pub fn just_deactivated(&self, input: T) -> bool {
self.just_deactivated.contains(&input)
}
}
impl<T> DigitalInput<T>
where
T: Hash + Copy + Eq,
{
pub(crate) fn activate(&mut self, input: T) {
if !self.activated(input) {
self.activated.insert(input);
self.just_activated.insert(input);
self.just_deactivated.remove(&input);
}
}
pub(crate) fn deactivate(&mut self, input: T) {
if self.activated(input) {
self.activated.remove(&input);
self.just_activated.remove(&input);
self.just_deactivated.insert(input);
}
}
pub(crate) fn update(&mut self) {
self.just_activated.clear();
self.just_deactivated.clear();
}
}
impl<T> Default for DigitalInput<T> {
fn default() -> Self {
Self {
activated: Default::default(),
just_activated: Default::default(),
just_deactivated: Default::default(),
}
}
}