gdp_rs 0.0.2

A library for implementing Ghosts-of-departed-proofs pattern in rust
Documentation
use frunk_core::hlist::{HCons, HList, HNil};

use super::{Evaluable, Proposition};

/// A trait for `HList` of [`Proposition`]s..
pub trait PropositionList<S>: HList {}

pub trait EvaluablePropositionList<S>: PropositionList<S> {
    /// Evaluate the all propositions in list for given subject.
    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(())
    }
}