use crate::HostTypes;
pub trait Effect<H: HostTypes> {
type EffectTarget: EffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget;
type Context: crate::user::state::Context<H>;
fn pre_context(&self) -> &Self::Context;
fn post_context(&self) -> &Self::Context;
fn free_rank_delta(&self) -> i64;
fn composite_index(&self) -> u64;
fn is_commutative_with(&self) -> bool;
}
pub trait ReversibleEffect<H: HostTypes>: Effect<H> {}
pub trait PinningEffect<H: HostTypes>: ReversibleEffect<H> {}
pub trait UnbindingEffect<H: HostTypes>: Effect<H> {}
pub trait PhaseEffect<H: HostTypes>: ReversibleEffect<H> {
fn phase_angle_delta(&self) -> H::Decimal;
}
pub trait CompositeEffect<H: HostTypes>: Effect<H> {
type Effect: Effect<H>;
fn composite_head(&self) -> &Self::Effect;
fn composite_tail(&self) -> &[Self::Effect];
}
pub trait ExternalEffect<H: HostTypes>: Effect<H> {
type EffectShape: crate::bridge::conformance_::EffectShape<H>;
fn external_effect_shape(&self) -> &Self::EffectShape;
}
pub trait EffectTarget<H: HostTypes> {
type SiteIndex: crate::bridge::partition::SiteIndex<H>;
fn target_sites(&self) -> &[Self::SiteIndex];
fn target_cardinality(&self) -> u64;
}
pub trait DisjointnessWitness<H: HostTypes> {
type EffectTarget: EffectTarget<H>;
fn disjointness_left(&self) -> &Self::EffectTarget;
fn disjointness_right(&self) -> &Self::EffectTarget;
}