use crate::resolve::EdgeOrData;
pub trait DataWellformedness<DATA> {
fn data_wf(&self, data: &DATA) -> bool;
}
impl<DATA, T> DataWellformedness<DATA> for T
where
for<'sg> T: Fn(&'sg DATA) -> bool,
{
fn data_wf(&self, data: &DATA) -> bool {
self(data)
}
}
#[derive(Default)]
pub struct DefaultDataWellformedness {}
impl<DATA> DataWellformedness<DATA> for DefaultDataWellformedness {
fn data_wf(&self, _data: &DATA) -> bool {
true }
}
pub trait LabelOrder<LABEL> {
fn less_than(&self, l1: &EdgeOrData<LABEL>, l2: &EdgeOrData<LABEL>) -> bool;
}
impl<LABEL, T> LabelOrder<LABEL> for T
where
T: for<'a, 'b> Fn(&'a EdgeOrData<LABEL>, &'b EdgeOrData<LABEL>) -> bool,
{
fn less_than(&self, l1: &EdgeOrData<LABEL>, l2: &EdgeOrData<LABEL>) -> bool {
self(l1, l2)
}
}
#[derive(Default)]
pub struct DefaultLabelOrder {}
impl<LABEL> LabelOrder<LABEL> for DefaultLabelOrder {
fn less_than(&self, _l1: &EdgeOrData<LABEL>, _l2: &EdgeOrData<LABEL>) -> bool {
false }
}
pub trait DataEquiv<DATA> {
fn data_equiv(&self, d1: &DATA, d2: &DATA) -> bool;
fn always_true(&self) -> bool {
false
}
}
impl<DATA, T> DataEquiv<DATA> for T
where
for<'sg> T: Fn(&'sg DATA, &'sg DATA) -> bool,
{
fn data_equiv(&self, d1: &DATA, d2: &DATA) -> bool {
self(d1, d2)
}
}
#[derive(Default)]
pub struct DefaultDataEquiv {}
impl<DATA> DataEquiv<DATA> for DefaultDataEquiv {
fn data_equiv(&self, _d1: &DATA, _d2: &DATA) -> bool {
true }
fn always_true(&self) -> bool {
true
}
}