sim_lib_pattern/
cursor.rs1use core::fmt::Debug;
4use core::marker::PhantomData;
5
6pub use sim_text::{CodeUnitOffset, ScalarOffset};
8
9pub trait SymbolDomain {
14 type Symbol;
16 type Offset: Copy + Debug + Eq + Ord;
18}
19
20#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
22pub struct ByteOffset(pub usize);
23
24#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
26pub struct ByteDomain;
27
28impl SymbolDomain for ByteDomain {
29 type Symbol = u8;
30 type Offset = ByteOffset;
31}
32
33#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
35pub struct ScalarDomain;
36
37impl SymbolDomain for ScalarDomain {
38 type Symbol = char;
39 type Offset = ScalarOffset;
40}
41
42#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
44pub struct CodeUnitDomain;
45
46impl SymbolDomain for CodeUnitDomain {
47 type Symbol = u16;
48 type Offset = CodeUnitOffset;
49}
50
51#[derive(Clone, Copy, Debug, PartialEq, Eq)]
61pub struct Cursor<D: SymbolDomain> {
62 source: D::Offset,
63 subject: D::Offset,
64 domain: PhantomData<fn() -> D>,
65}
66
67impl<D: SymbolDomain> Cursor<D> {
68 pub const fn new(source: D::Offset, subject: D::Offset) -> Self {
70 Self {
71 source,
72 subject,
73 domain: PhantomData,
74 }
75 }
76
77 pub const fn source_position(&self) -> D::Offset {
79 self.source
80 }
81
82 pub const fn subject_position(&self) -> D::Offset {
84 self.subject
85 }
86
87 pub const fn advanced(self, source: D::Offset, subject: D::Offset) -> Self {
89 Self::new(source, subject)
90 }
91}