abyss_core/parser/
span.rs1use std::ops::Range;
2
3use chumsky::span::Span as ChumskySpan;
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
7pub struct SimpleSpan<T> {
8 start: T,
9 end: T,
10}
11
12impl<T: Copy + Ord> SimpleSpan<T> {
13 pub fn new(start: T, end: T) -> Self {
14 Self { start, end }
15 }
16
17 pub fn start(&self) -> T {
18 self.start
19 }
20
21 pub fn end(&self) -> T {
22 self.end
23 }
24
25 pub fn into_range(self) -> Range<T> {
26 self.start..self.end
27 }
28}
29
30impl<T: Copy + Ord> From<Range<T>> for SimpleSpan<T> {
31 fn from(range: Range<T>) -> Self {
32 Self {
33 start: range.start,
34 end: range.end,
35 }
36 }
37}
38
39impl<T: Copy + Ord> From<SimpleSpan<T>> for Range<T> {
40 fn from(span: SimpleSpan<T>) -> Self {
41 span.into_range()
42 }
43}
44
45impl<T: Copy + Ord> ChumskySpan for SimpleSpan<T> {
46 type Context = ();
47 type Offset = T;
48
49 fn new(_: Self::Context, range: Range<Self::Offset>) -> Self {
50 Self {
51 start: range.start,
52 end: range.end,
53 }
54 }
55
56 fn context(&self) -> Self::Context {}
57
58 fn start(&self) -> Self::Offset {
59 self.start
60 }
61
62 fn end(&self) -> Self::Offset {
63 self.end
64 }
65}