use crate::HostTypes;
pub trait ParallelProduct<H: HostTypes> {
type MonoidalProduct: crate::kernel::monoidal::MonoidalProduct<H>;
fn left_computation(&self) -> &Self::MonoidalProduct;
fn right_computation(&self) -> &Self::MonoidalProduct;
type DisjointnessCertificate: DisjointnessCertificate<H>;
fn disjointness_cert(&self) -> &Self::DisjointnessCertificate;
fn is_fully_disjoint(&self) -> bool;
fn disjointness_commutation(&self) -> bool;
type Partition: crate::bridge::partition::Partition<H>;
fn site_partition(&self) -> &Self::Partition;
fn disjointness_witness(&self) -> &H::HostString;
}
pub trait DisjointnessCertificate<H: HostTypes>: crate::bridge::cert::Certificate<H> {
type EffectTarget: crate::kernel::effect::EffectTarget<H>;
fn cert_left_target(&self) -> &Self::EffectTarget;
fn cert_right_target(&self) -> &Self::EffectTarget;
}
pub trait SynchronizationPoint<H: HostTypes> {
type SiteIndex: crate::bridge::partition::SiteIndex<H>;
fn sync_sites(&self) -> &[Self::SiteIndex];
}
pub trait ParallelTrace<H: HostTypes>: crate::bridge::trace::ComputationTrace<H> {}
pub trait SitePartitioning<H: HostTypes> {
type EffectTarget: crate::kernel::effect::EffectTarget<H>;
fn partition_components(&self) -> &[Self::EffectTarget];
fn component_count(&self) -> u64;
}