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