use crate::{StateTransition, Timeline};
#[derive(Debug, Clone, PartialEq)]
pub struct StateTransitionSet<S>
where
S: Copy + Eq,
{
transitions: Vec<StateTransition<S>>,
fallback: Option<Timeline>,
}
impl<S> StateTransitionSet<S>
where
S: Copy + Eq,
{
#[must_use]
pub const fn new() -> Self {
Self {
transitions: Vec::new(),
fallback: None,
}
}
#[must_use]
pub fn from_transitions(transitions: impl IntoIterator<Item = StateTransition<S>>) -> Self {
Self {
transitions: transitions.into_iter().collect(),
fallback: None,
}
}
#[must_use]
pub fn with_fallback(mut self, fallback: Timeline) -> Self {
self.fallback = Some(fallback);
self
}
pub fn push(&mut self, transition: StateTransition<S>) {
self.transitions.push(transition);
}
#[must_use]
pub fn transitions(&self) -> &[StateTransition<S>] {
&self.transitions
}
#[must_use]
pub fn fallback(&self) -> Option<&Timeline> {
self.fallback.as_ref()
}
#[must_use]
pub fn find(&self, from: S, to: S) -> Option<&StateTransition<S>> {
self.transitions
.iter()
.find(|transition| transition.from() == from && transition.to() == to)
}
}
impl<S> Default for StateTransitionSet<S>
where
S: Copy + Eq,
{
fn default() -> Self {
Self::new()
}
}
impl<S> From<Vec<StateTransition<S>>> for StateTransitionSet<S>
where
S: Copy + Eq,
{
fn from(value: Vec<StateTransition<S>>) -> Self {
Self::from_transitions(value)
}
}