use crate::{
Interpretation, Literal, LiteralRef,
vocabulary::{LiteralVocabulary, LiteralVocabularyMut},
};
pub trait LiteralInterpretation<L>: Interpretation {
fn literal_interpretation(&self, literal: &L) -> Option<Self::Resource>;
fn lexical_literal_interpretation<V: LiteralVocabulary<Literal = L>>(
&self,
vocabulary: &V,
literal: LiteralRef<'_>,
) -> Option<Self::Resource> {
vocabulary
.get_literal(literal)
.and_then(|l| self.literal_interpretation(&l))
}
}
impl<L, T: LiteralInterpretation<L>> LiteralInterpretation<L> for &T {
fn literal_interpretation(&self, literal: &L) -> Option<Self::Resource> {
T::literal_interpretation(*self, literal)
}
fn lexical_literal_interpretation<V: LiteralVocabulary<Literal = L>>(
&self,
vocabulary: &V,
literal: LiteralRef<'_>,
) -> Option<Self::Resource> {
T::lexical_literal_interpretation(*self, vocabulary, literal)
}
}
impl<L, T: LiteralInterpretation<L>> LiteralInterpretation<L> for &mut T {
fn literal_interpretation(&self, literal: &L) -> Option<Self::Resource> {
T::literal_interpretation(*self, literal)
}
fn lexical_literal_interpretation<V: LiteralVocabulary<Literal = L>>(
&self,
vocabulary: &V,
literal: LiteralRef<'_>,
) -> Option<Self::Resource> {
T::lexical_literal_interpretation(*self, vocabulary, literal)
}
}
pub trait LiteralInterpretationMut<L = Literal>: Interpretation {
fn interpret_literal(&mut self, literal: L) -> Self::Resource;
fn interpret_lexical_literal<V: LiteralVocabularyMut<Literal = L>>(
&mut self,
vocabulary: &mut V,
literal: LiteralRef<'_>,
) -> Self::Resource {
self.interpret_literal(vocabulary.insert_literal(literal))
}
fn interpret_owned_lexical_literal<V: LiteralVocabularyMut<Literal = L>>(
&mut self,
vocabulary: &mut V,
literal: Literal,
) -> Self::Resource {
self.interpret_literal(vocabulary.insert_owned_literal(literal))
}
}
pub trait ReverseLiteralInterpretation: Interpretation {
type Literal;
type Literals<'a>: Clone + Iterator<Item = &'a Self::Literal>
where
Self: 'a;
fn literals_of<'a>(&'a self, id: &'a Self::Resource) -> Self::Literals<'a>;
}
impl<T: ReverseLiteralInterpretation> ReverseLiteralInterpretation for &T {
type Literal = T::Literal;
type Literals<'a>
= T::Literals<'a>
where
Self: 'a;
fn literals_of<'a>(&'a self, id: &'a Self::Resource) -> Self::Literals<'a> {
T::literals_of(*self, id)
}
}
impl<T: ReverseLiteralInterpretation> ReverseLiteralInterpretation for &mut T {
type Literal = T::Literal;
type Literals<'a>
= T::Literals<'a>
where
Self: 'a;
fn literals_of<'a>(&'a self, id: &'a Self::Resource) -> Self::Literals<'a> {
T::literals_of(*self, id)
}
}