use alloc::format;
use alloc::string::String;
use crate::context::Context;
use crate::step::{Progress, StepFacts};
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SequenceRef(u64);
impl SequenceRef {
#[must_use]
pub const fn from_raw(raw: u64) -> Self {
Self(raw)
}
#[must_use]
pub const fn to_raw(self) -> u64 {
self.0
}
}
pub trait SequenceFacts {
fn step_count(&mut self, sequence: SequenceRef) -> Option<usize>;
fn step_facts(&mut self, sequence: SequenceRef, index: usize) -> Option<StepFacts>;
fn step_enabled(&mut self, sequence: SequenceRef, index: usize) -> Option<bool> {
self.step_facts(sequence, index).map(|facts| facts.enabled)
}
fn name(&mut self, sequence: SequenceRef) -> String {
format!("seq#{:x}", sequence.to_raw())
}
}
pub trait SequenceSource: SequenceFacts {
fn start_step(
&mut self,
sequence: SequenceRef,
index: usize,
ctx: &mut Context<'_>,
) -> Option<Progress>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sequence_ref_round_trips_raw() {
let r = SequenceRef::from_raw(0xDEAD_BEEF);
assert_eq!(r.to_raw(), 0xDEAD_BEEF);
assert_eq!(r, SequenceRef::from_raw(0xDEAD_BEEF));
}
}