use std::ops::Range;
use crate::util::{Region};
#[derive(Clone,Copy,Debug,PartialEq)]
pub struct Token<T>
{
pub kind : T,
pub region: Region
}
impl<T> Token<T> {
pub fn new(kind: T, range: Range<usize>) -> Self {
Self { kind, region: Region::from(range) }
}
pub fn start(&self) -> usize {
self.region.start
}
pub fn end(&self) -> usize {
self.region.end
}
pub fn len(&self) -> usize {
self.region.end - self.region.start
}
pub fn range(&self) -> Range<usize> { self.start() .. self.end() }
pub fn shift(&mut self, delta: usize) {
self.region.shift(delta);
}
}
impl<T:PartialEq> PartialEq<(T,Range<usize>)> for Token<T> {
fn eq(&self, other: &(T,Range<usize>)) -> bool {
self.kind == other.0 && self.range() == other.1
}
}
#[derive(Clone,Copy,Debug,PartialEq)]
pub struct TokenStr<'a, T>
{
pub kind : T,
pub text: &'a str
}
impl<'a, T> TokenStr<'a, T> {
pub fn new(kind: T, text: &'a str) -> Self {
Self { kind, text }
}
pub fn from_token(input: &'a str, tok: Token<T>) -> Self {
let t = &input[tok.range()];
Self { kind: tok.kind, text: t }
}
pub fn start(&self) -> usize {
todo!()
}
pub fn end(&self) -> usize {
todo!()
}
pub fn len(&self) -> usize {
self.text.len()
}
}