use data::LinkReference;
use crate::Doublets;
pub trait CriterionMatcher<T: LinkReference> {
fn is_matched<L: Doublets<T> + ?Sized>(&self, links: &L, link: T) -> bool;
}
impl<T: LinkReference, F: Fn(T) -> bool> CriterionMatcher<T> for F {
fn is_matched<L: Doublets<T> + ?Sized>(&self, _links: &L, link: T) -> bool {
self(link)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct TargetMatcher<T> {
target: T,
}
impl<T: LinkReference> TargetMatcher<T> {
#[must_use]
pub const fn new(target: T) -> Self {
Self { target }
}
#[must_use]
pub const fn target(&self) -> T {
self.target
}
pub fn is_matched<L: Doublets<T> + ?Sized>(&self, links: &L, link: T) -> bool {
links
.get_link(link)
.is_some_and(|link| link.target == self.target)
}
}
impl<T: LinkReference> CriterionMatcher<T> for TargetMatcher<T> {
fn is_matched<L: Doublets<T> + ?Sized>(&self, links: &L, link: T) -> bool {
self.is_matched(links, link)
}
}