use std::fmt::Display;
use crate::utils::{Located, Location};
#[derive(Debug, Eq, Clone, Copy)]
pub struct Tok<K: TokenKind> {
pub kind: K,
pub location: Location,
}
impl<K: TokenKind> Tok<K> {
pub fn new(kind: K, location: Location) -> Self {
Self { kind, location }
}
}
impl<K: TokenKind> PartialEq<Tok<K>> for Tok<K> {
fn eq(&self, other: &Tok<K>) -> bool {
self.kind == other.kind
}
}
impl<K: TokenKind> Token<K> for Tok<K> {
fn kind(self) -> K {
self.kind
}
fn kind_ref(&self) -> &K {
&self.kind
}
}
impl<K: TokenKind> Located for Tok<K> {
fn location(&self) -> Location {
self.location
}
}
impl<K: TokenKind> Display for Tok<K> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(&self.kind, f)
}
}
impl<K: TokenKind> From<Tok<K>> for String {
fn from(val: Tok<K>) -> Self {
val.to_string()
}
}
pub trait Token<K: TokenKind>: std::fmt::Debug + Located + Sized {
fn kind(self) -> K;
fn kind_ref(&self) -> &K;
}
pub trait TokenKind: std::fmt::Debug + PartialEq + Sized + Display + Clone + Send + Sync {}