use crate::Primitives;
pub trait ComputationResult<P: Primitives> {}
pub trait Success<P: Primitives>: ComputationResult<P> {
type Datum: crate::kernel::schema::Datum<P>;
fn result_datum(&self) -> &Self::Datum;
type ComputationCertificate: crate::bridge::proof::ComputationCertificate<P>;
fn result_certificate(&self) -> &Self::ComputationCertificate;
}
pub trait Failure<P: Primitives>: ComputationResult<P> {
type FailureReason: FailureReason<P>;
fn failure_reason(&self) -> &Self::FailureReason;
type ReductionState: crate::kernel::reduction::ReductionState<P>;
fn failure_state(&self) -> &Self::ReductionState;
type ReductionStep: crate::kernel::reduction::ReductionStep<P>;
fn failure_stage(&self) -> &Self::ReductionStep;
type Recovery: Recovery<P>;
fn recovery_strategy(&self) -> &[Self::Recovery];
fn failure_depth(&self) -> P::NonNegativeInteger;
}
pub trait FailureReason<P: Primitives> {}
pub trait GuardFailure<P: Primitives>: FailureReason<P> {}
pub trait ConstraintContradiction<P: Primitives>: FailureReason<P> {}
pub trait SiteExhaustion<P: Primitives>: FailureReason<P> {}
pub trait LiftObstructionFailure<P: Primitives>: FailureReason<P> {}
pub trait PartialComputation<P: Primitives> {
fn is_total(&self) -> P::Boolean;
}
pub trait TotalComputation<P: Primitives>: PartialComputation<P> {}
pub trait Recovery<P: Primitives> {
type Effect: crate::kernel::effect::Effect<P>;
fn recovery_effect(&self) -> &Self::Effect;
type ReductionStep: crate::kernel::reduction::ReductionStep<P>;
fn recovery_target(&self) -> &Self::ReductionStep;
}
pub trait FailurePropagation<P: Primitives> {
type FailureReason: FailureReason<P>;
fn propagation_rule(&self) -> &[Self::FailureReason];
}