use crate::Primitives;
pub trait ParallelProduct<P: Primitives> {
type MonoidalProduct: crate::kernel::monoidal::MonoidalProduct<P>;
fn left_computation(&self) -> &Self::MonoidalProduct;
fn right_computation(&self) -> &Self::MonoidalProduct;
type DisjointnessCertificate: DisjointnessCertificate<P>;
fn disjointness_cert(&self) -> &Self::DisjointnessCertificate;
fn is_fully_disjoint(&self) -> P::Boolean;
fn disjointness_commutation(&self) -> P::Boolean;
}
pub trait DisjointnessCertificate<P: Primitives>: crate::bridge::cert::Certificate<P> {
type EffectTarget: crate::kernel::effect::EffectTarget<P>;
fn cert_left_target(&self) -> &Self::EffectTarget;
fn cert_right_target(&self) -> &Self::EffectTarget;
}
pub trait SynchronizationPoint<P: Primitives> {
type SiteIndex: crate::bridge::partition::SiteIndex<P>;
fn sync_sites(&self) -> &[Self::SiteIndex];
}
pub trait ParallelTrace<P: Primitives>: crate::bridge::trace::ComputationTrace<P> {}
pub trait SitePartitioning<P: Primitives> {
type EffectTarget: crate::kernel::effect::EffectTarget<P>;
fn partition_components(&self) -> &[Self::EffectTarget];
fn component_count(&self) -> P::PositiveInteger;
}