mod empty;
mod tap;
pub use empty::Empty;
pub use tap::Tap;
use crate::{
host::{LoadableAsset, SeekableAsset},
Result,
};
use enum_dispatch::enum_dispatch;
#[allow(clippy::large_enum_variant)]
#[enum_dispatch(TapeImpl)]
pub enum ZXTape<A: LoadableAsset + SeekableAsset> {
Tap(Tap<A>),
Empty(Empty),
}
impl<A: LoadableAsset + SeekableAsset> Default for ZXTape<A> {
fn default() -> Self {
Self::Empty(Empty)
}
}
#[enum_dispatch]
pub trait TapeImpl {
fn can_fast_load(&self) -> bool;
fn next_block_byte(&mut self) -> Result<Option<u8>>;
fn next_block(&mut self) -> Result<bool>;
fn current_bit(&self) -> bool;
fn process_clocks(&mut self, clocks: usize) -> Result<()>;
fn stop(&mut self);
fn play(&mut self);
fn rewind(&mut self) -> Result<()>;
}