use frunk_core::hlist::{HCons, HList, HNil};
use super::{Evaluable, Proposition};
pub trait PropositionList<S>: HList {}
pub trait EvaluablePropositionList<S>: PropositionList<S> {
fn evaluate_all_for(sub: &S) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>>;
}
impl<S, H, T> PropositionList<S> for HCons<H, T>
where
H: Proposition<S>,
T: PropositionList<S>,
{
}
impl<S, H, T> EvaluablePropositionList<S> for HCons<H, T>
where
H: Evaluable<S>,
T: EvaluablePropositionList<S>,
{
fn evaluate_all_for(sub: &S) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
match H::evaluate_for(sub) {
Ok(_) => T::evaluate_all_for(sub),
Err(e) => Err(e.into()),
}
}
}
impl<S> PropositionList<S> for HNil {}
impl<S> EvaluablePropositionList<S> for HNil {
#[inline]
fn evaluate_all_for(
_sub: &S,
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
Ok(())
}
}