use crate::{HeapTerm, Quad, QuadPattern, Term, Triple, TriplePattern};
pub trait Statement {
type Term: Term + Clone;
fn subject(&self) -> &Self::Term;
fn predicate(&self) -> &Self::Term;
fn object(&self) -> &Self::Term;
fn context(&self) -> Option<&Self::Term> {
None
}
fn to_triple(&self) -> Triple<Self::Term> {
Triple::new(
self.subject().clone(),
self.predicate().clone(),
self.object().clone(),
)
}
fn to_triple_pattern(&self) -> TriplePattern<Self::Term> {
TriplePattern::new(
Some(self.subject().clone()),
Some(self.predicate().clone()),
Some(self.object().clone()),
)
}
fn to_quad(&self) -> Quad<Self::Term> {
Quad::new(
self.subject().clone(),
self.predicate().clone(),
self.object().clone(),
self.context().cloned(),
)
}
fn to_quad_pattern(&self) -> QuadPattern<Self::Term> {
QuadPattern::new(
Some(self.subject().clone()),
Some(self.predicate().clone()),
Some(self.object().clone()),
self.context().cloned(),
)
}
}
impl core::fmt::Debug for dyn Statement<Term = HeapTerm> {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
f.debug_struct("Statement")
.field("subject", &self.subject().value_str())
.field("predicate", &self.predicate().value_str())
.field("object", &self.object().value_str())
.field("context", &self.context().map(|t| t.value_str()))
.finish()
}
}