use std::collections::VecDeque;
use std::sync::{Arc, Mutex};
pub const LEDGER_CAP: usize = 1024;
#[derive(Clone, Debug, PartialEq)]
pub enum IssuedKind {
Tap,
Fill,
TapAtCoord {
nx: f64,
ny: f64,
},
SwipeAtCoord {
from: (f64, f64),
to: (f64, f64),
},
CapsuleStart,
FixtureAction(String),
}
#[derive(Clone, Debug, PartialEq)]
pub struct IssuedAction {
pub kind: IssuedKind,
pub timestamp_ms: f64,
pub target_hint: Option<String>,
}
#[derive(Clone, Debug, Default)]
pub struct IssuedLedger {
inner: Arc<Mutex<VecDeque<IssuedAction>>>,
}
impl IssuedLedger {
pub fn new() -> Self {
Self {
inner: Arc::new(Mutex::new(VecDeque::with_capacity(LEDGER_CAP))),
}
}
pub fn record(&self, action: IssuedAction) {
let mut q = self.inner.lock().expect("issued ledger mutex poisoned");
if q.len() >= LEDGER_CAP {
q.pop_front();
}
q.push_back(action);
}
pub fn record_tap(&self, ts_ms: f64, target_hint: Option<String>) {
self.record(IssuedAction {
kind: IssuedKind::Tap,
timestamp_ms: ts_ms,
target_hint,
});
}
pub fn record_fill(&self, ts_ms: f64, target_hint: Option<String>) {
self.record(IssuedAction {
kind: IssuedKind::Fill,
timestamp_ms: ts_ms,
target_hint,
});
}
pub fn record_tap_at_coord(&self, ts_ms: f64, nx: f64, ny: f64) {
self.record(IssuedAction {
kind: IssuedKind::TapAtCoord { nx, ny },
timestamp_ms: ts_ms,
target_hint: None,
});
}
pub fn record_swipe_at_coord(&self, ts_ms: f64, from: (f64, f64), to: (f64, f64)) {
self.record(IssuedAction {
kind: IssuedKind::SwipeAtCoord { from, to },
timestamp_ms: ts_ms,
target_hint: None,
});
}
pub fn record_capsule_start(&self, ts_ms: f64) {
self.record(IssuedAction {
kind: IssuedKind::CapsuleStart,
timestamp_ms: ts_ms,
target_hint: None,
});
}
pub fn record_fixture_action(&self, ts_ms: f64, action_id: String) {
self.record(IssuedAction {
kind: IssuedKind::FixtureAction(action_id.clone()),
timestamp_ms: ts_ms,
target_hint: Some(action_id),
});
}
pub fn get_all(&self) -> Vec<IssuedAction> {
let q = self.inner.lock().expect("issued ledger mutex poisoned");
q.iter().cloned().collect()
}
pub fn clear(&self) {
let mut q = self.inner.lock().expect("issued ledger mutex poisoned");
q.clear();
}
}