reaction 0.2.0

Universal low-latency input handling for game engines
Documentation
use crate::event::events::TimestampedEvent;
use std::collections::VecDeque;

pub struct EventHistory {
    events: VecDeque<TimestampedEvent>,
    max_duration_ms: f64,
}

impl EventHistory {
    pub fn new(max_duration_ms: f64) -> Self {
        Self {
            events: VecDeque::new(),
            max_duration_ms,
        }
    }

    pub fn record(&mut self, event: TimestampedEvent) {
        self.events.push_back(event);
        self.prune();
    }

    fn prune(&mut self) {
        if let Some(last) = self.events.back() {
            let threshold = last.timestamp - self.max_duration_ms;
            while let Some(first) = self.events.front() {
                if first.timestamp < threshold {
                    self.events.pop_front();
                } else {
                    break;
                }
            }
        }
    }

    pub fn get_events_since(&self, timestamp: f64) -> Vec<&TimestampedEvent> {
        self.events
            .iter()
            .filter(|e| e.timestamp >= timestamp)
            .collect()
    }
}