use std::fmt::Debug;
use dashmap::DashMap;
use crate::state::FsmState;
pub struct StateCache<S: Clone + Debug, P: Clone + Debug> {
cache: DashMap<String, FsmState<S, P>>,
}
impl<S: Clone + Debug + Send + Sync, P: Clone + Debug + Send + Sync> StateCache<S, P> {
pub fn new() -> Self {
Self {
cache: DashMap::new(),
}
}
pub fn get(&self, name: &str) -> Option<FsmState<S, P>> {
self.cache.get(name).map(|entry| entry.value().clone())
}
pub fn get_state(&self, name: &str) -> Option<S> {
self.cache
.get(name)
.map(|entry| entry.value().current.clone())
}
pub fn get_payload(&self, name: &str) -> Option<P> {
self.cache
.get(name)
.map(|entry| entry.value().payload.clone())
}
pub fn update(&self, state: &FsmState<S, P>) {
self.cache.insert(state.name.clone(), state.clone());
}
pub fn remove(&self, name: &str) {
self.cache.remove(name);
}
pub fn contains(&self, name: &str) -> bool {
self.cache.contains_key(name)
}
pub fn all(&self) -> Vec<(String, FsmState<S, P>)> {
self.cache
.iter()
.map(|entry| (entry.key().clone(), entry.value().clone()))
.collect()
}
pub fn len(&self) -> usize {
self.cache.len()
}
pub fn is_empty(&self) -> bool {
self.cache.is_empty()
}
}
impl<S: Clone + Debug + Send + Sync, P: Clone + Debug + Send + Sync> Default for StateCache<S, P> {
fn default() -> Self {
Self::new()
}
}