use super::{Clip, Cond, Name, ParamId, Params};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct StateId(pub(crate) u16);
#[derive(Clone, Debug, PartialEq)]
pub enum Rate<P = ParamId> {
Fixed(f32),
Param {
param: P,
per: f32,
min: f32,
max: f32,
},
}
#[derive(Clone, Debug, PartialEq)]
pub struct State {
pub name: Name,
pub clip: Clip,
pub rate: Rate,
pub lock: f32,
pub next: Option<StateId>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Source {
States(Vec<StateId>),
Any {
except: Vec<StateId>,
},
}
impl Source {
pub fn applies(&self, s: StateId) -> bool {
match self {
Source::States(v) => v.contains(&s),
Source::Any { except } => !except.contains(&s),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct Transition {
pub from: Source,
pub to: StateId,
pub when: Cond,
pub priority: i32,
pub breaks_lock: bool,
pub restart: bool,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Graph {
pub params: Params,
pub states: Vec<State>,
pub transitions: Vec<Transition>,
pub entry: StateId,
}
impl Graph {
pub fn state(&self, id: StateId) -> &State {
&self.states[id.0 as usize]
}
pub fn find(&self, name: &str) -> Option<StateId> {
self.states
.iter()
.position(|s| s.name == name)
.map(|i| StateId(i as u16))
}
pub fn ids(&self) -> impl Iterator<Item = StateId> {
(0..self.states.len()).map(|i| StateId(i as u16))
}
}