use core::fmt::Debug;
use core::marker::PhantomData;
pub use sim_text::{CodeUnitOffset, ScalarOffset};
pub trait SymbolDomain {
type Symbol;
type Offset: Copy + Debug + Eq + Ord;
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ByteOffset(pub usize);
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct ByteDomain;
impl SymbolDomain for ByteDomain {
type Symbol = u8;
type Offset = ByteOffset;
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct ScalarDomain;
impl SymbolDomain for ScalarDomain {
type Symbol = char;
type Offset = ScalarOffset;
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct CodeUnitDomain;
impl SymbolDomain for CodeUnitDomain {
type Symbol = u16;
type Offset = CodeUnitOffset;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Cursor<D: SymbolDomain> {
source: D::Offset,
subject: D::Offset,
domain: PhantomData<fn() -> D>,
}
impl<D: SymbolDomain> Cursor<D> {
pub const fn new(source: D::Offset, subject: D::Offset) -> Self {
Self {
source,
subject,
domain: PhantomData,
}
}
pub const fn source_position(&self) -> D::Offset {
self.source
}
pub const fn subject_position(&self) -> D::Offset {
self.subject
}
pub const fn advanced(self, source: D::Offset, subject: D::Offset) -> Self {
Self::new(source, subject)
}
}