use std::any::Any;
use std::collections::VecDeque;
use crate::chip::Timeline;
use crate::snapshot::{Store, store};
use crate::time::EventId;
pub trait Peer: Store + std::fmt::Debug + Send + Any {
fn transfer(&mut self, mosi: u32, bits: u8, context: &mut Timeline<'_, '_>) -> u32;
fn select(&mut self, _context: &mut Timeline<'_, '_>) {}
fn deselect(&mut self, _context: &mut Timeline<'_, '_>) {}
fn on_event(&mut self, _event: EventId, _context: &mut Timeline<'_, '_>) {}
fn restarted(&mut self, _context: &mut Timeline<'_, '_>) {}
fn received(&self) -> &[u32] {
&[]
}
}
#[derive(Debug, Default, serde::Serialize, serde::Deserialize)]
pub struct Pattern {
answers: VecDeque<u32>,
held: u32,
received: Vec<u32>,
}
impl Pattern {
#[must_use]
pub fn answering(words: impl IntoIterator<Item = u32>) -> Self {
Self {
answers: words.into_iter().collect(),
held: 0,
received: Vec::new(),
}
}
}
store!(Pattern);
impl Peer for Pattern {
fn received(&self) -> &[u32] {
&self.received
}
fn transfer(&mut self, mosi: u32, _bits: u8, _context: &mut Timeline<'_, '_>) -> u32 {
self.received.push(mosi);
if let Some(word) = self.answers.pop_front() {
self.held = word;
}
self.held
}
}