sophia_api/term/matcher/
_graph_name_matcher.rsuse super::*;
pub trait GraphNameMatcher {
type Term: Term + ?Sized;
fn matches<T2: Term + ?Sized>(&self, graph_name: GraphName<&T2>) -> bool;
fn constant(&self) -> Option<GraphName<&Self::Term>> {
None
}
fn matcher_ref(&self) -> MatcherRef<'_, Self> {
MatcherRef(self)
}
}
impl<T> GraphNameMatcher for Option<Option<T>>
where
T: Term,
{
type Term = T;
fn matches<T2: Term + ?Sized>(&self, graph_name: GraphName<&T2>) -> bool {
match self {
Some(mine) => graph_name_eq(
mine.as_ref().map(|gn| gn.borrow_term()),
graph_name.map(|gn| gn.borrow_term()),
),
None => false,
}
}
fn constant(&self) -> Option<GraphName<&Self::Term>> {
self.as_ref().map(GraphName::as_ref)
}
}
impl<T, const N: usize> GraphNameMatcher for [GraphName<T>; N]
where
T: Term,
{
type Term = T;
fn matches<T2: Term + ?Sized>(&self, graph_name: GraphName<&T2>) -> bool {
self.iter().any(|mine| {
graph_name_eq(
mine.as_ref().map(|gn| gn.borrow_term()),
graph_name.map(|gn| gn.borrow_term()),
)
})
}
fn constant(&self) -> Option<GraphName<&Self::Term>> {
if N == 1 {
Some(self[0].as_ref())
} else {
None
}
}
}
impl<T> GraphNameMatcher for &[GraphName<T>]
where
T: Term,
{
type Term = T;
fn matches<T2: Term + ?Sized>(&self, graph_name: GraphName<&T2>) -> bool {
self.iter().any(|mine| {
graph_name_eq(
mine.as_ref().map(|gn| gn.borrow_term()),
graph_name.map(|gn| gn.borrow_term()),
)
})
}
fn constant(&self) -> Option<GraphName<&Self::Term>> {
if self.len() == 1 {
Some(self[0].as_ref())
} else {
None
}
}
}
impl GraphNameMatcher for Option<TermKind> {
type Term = SimpleTerm<'static>; fn matches<T2: Term + ?Sized>(&self, graph_name: GraphName<&T2>) -> bool {
graph_name.map(Term::kind) == *self
}
}
impl<S, P, O> GraphNameMatcher for Option<(S, P, O)>
where
S: TermMatcher,
P: TermMatcher,
O: TermMatcher,
{
type Term = S::Term; fn matches<T2: Term + ?Sized>(&self, graph_name: Option<&T2>) -> bool {
match (self, graph_name.map(Term::triple)) {
(None, None) => true,
(Some((sm, pm, om)), Some(Some(t))) => {
t.matched_by(sm.matcher_ref(), pm.matcher_ref(), om.matcher_ref())
}
_ => false,
}
}
}
impl<F> GraphNameMatcher for F
where
F: Fn(GraphName<SimpleTerm>) -> bool + ?Sized,
{
type Term = SimpleTerm<'static>; fn matches<T2: Term + ?Sized>(&self, graph_name: GraphName<&T2>) -> bool {
(self)(graph_name.map(Term::as_simple))
}
}
impl GraphNameMatcher for Any {
type Term = SimpleTerm<'static>;
fn matches<T2: Term + ?Sized>(&self, _: GraphName<&T2>) -> bool {
true
}
}