Skip to main content

PropertyValueCountTrigger

Struct PropertyValueCountTrigger 

Source
pub struct PropertyValueCountTrigger<E, P>
where E: Entity, P: Property<E>,
{ /* private fields */ }
Expand description

Trigger criterion for the count of entities with a particular property value.

PropertyValueCountTrigger observes EntityCreatedEvent and PropertyChangeEvent for a specific entity/property pair and emits when the count of entities with a configured property value crosses a configured threshold.

§Construction

PropertyValueCountTrigger::<E, P>::increases_to(value, threshold)
PropertyValueCountTrigger::<E, P>::decreases_to(value, threshold)
PropertyValueCountTrigger::<E, P>::changes_to(value, threshold)
PropertyValueCountTrigger::<E, P>::changes_to(value, threshold).once()
PropertyValueCountTrigger::<E, P>::changes_to(value, threshold).repeating()

§Observation

The observation data passed to TriggerCriterion::emit_with is PropertyValueCountTriggerEvent. It contains the entity ID whose creation or property write caused the crossing, the tracked property value, the new count, the observed Direction, the configured direction filter as Option<Direction>, and the selected TriggerMode:

pub struct PropertyValueCountTriggerEvent<E, P>
where
    E: Entity,
    P: Property<E>,
{
    pub entity_id: EntityId<E>,
    pub value: P,
    pub count: usize,
    pub direction_filter: Option<Direction>,
    pub direction: Direction,
    pub mode: TriggerMode,
}

§Semantics

The initial count is measured when the trigger is registered. The criterion emits only on a later threshold crossing. Since counts change one entity at a time, a crossing occurs when the new count equals the threshold and differs from the previous count. Direction::Increasing means the count increased to the threshold, while Direction::Decreasing means the count decreased to the threshold. changes_to leaves the direction filter unset and emits for either observed direction. increases_to and decreases_to set the direction filter to the corresponding observed direction.

By default, the criterion uses TriggerMode::Repeating and emits every time the count crosses the threshold and passes the configured direction filter. Call PropertyValueCountTrigger::once to emit only for the first crossing, or PropertyValueCountTrigger::repeating to return to the default repeating behavior.

Entity creation can cause a crossing if the new entity has the tracked value. Property writes can cause a crossing when they move an entity into or out of the tracked value. A no-op write where previous == current still emits a property-change event at the entity layer, but it does not change this trigger’s tracked count and therefore cannot by itself cross the threshold.

§Example

use ixa::{Context, ContextEntitiesExt, define_entity, define_property, IxaEvent};
use ixa::entity::EntityId;
use ixa::triggers::{
    ContextTriggersExt, Direction, PropertyValueCountTrigger, TriggerCriterion, TriggerMode,
};

define_entity!(Person);
define_property!(
    enum InfectionStatus {
        Susceptible,
        Infectious,
    },
    Person,
    default_const = InfectionStatus::Susceptible
);

// The event records which person caused us to reach the threshold and
// the value of the threshold itself (as `count`).
#[derive(IxaEvent)]
struct InfectiousThresholdReached {
    person: EntityId<Person>,
    count: usize
}

let mut context = Context::new();

context.register_trigger(
    PropertyValueCountTrigger::increases_to(
        InfectionStatus::Infectious,
        2,
    ).emit_with(|observation| InfectiousThresholdReached {
        person: observation.entity_id,
        count: observation.count
    }),
);

context.subscribe_to_event(|_context, _event: InfectiousThresholdReached| {
    // respond when the infectious count crosses from below 2 to at least 2
});

Implementations§

Source§

impl<E, P> PropertyValueCountTrigger<E, P>
where E: Entity, P: Property<E>,

Source

pub fn increases_to(value: P, threshold: usize) -> Self

Source

pub fn decreases_to(value: P, threshold: usize) -> Self

Source

pub fn changes_to(value: P, threshold: usize) -> Self

Source

pub fn once(self) -> Self

Source

pub fn repeating(self) -> Self

Trait Implementations§

Source§

impl<E, P> TriggerCriterion for PropertyValueCountTrigger<E, P>
where E: Entity, P: Property<E>,

Source§

type Observation = PropertyValueCountTriggerEvent<E, P>

The data that represents what is observed when the criterion is met. This data is passed to the handler installed for this criterion.
Source§

fn install<F>(self, context: &mut Context, on_match: F)
where F: Fn(&mut Context, Self::Observation) + 'static,

Install the criterion’s monitoring logic in context.
Source§

fn emit_with<Ev, F>(self, make_event: F) -> Trigger<Self, Ev, F>
where Ev: IxaEvent, F: Fn(Self::Observation) -> Ev + 'static,

Bind this criterion to a constructor for a concrete user event.
Source§

fn emit_default<Ev>(self) -> Trigger<Self, Ev, impl Fn(Self::Observation) -> Ev>
where Ev: IxaEvent + Default,

Bind this criterion to a default-valued concrete user event.
Source§

fn emit_value<Ev>( self, event: Ev, ) -> Trigger<Self, Ev, impl Fn(Self::Observation) -> Ev>
where Ev: IxaEvent,

Bind this criterion to a constant concrete user event value.

Auto Trait Implementations§

§

impl<E, P> Freeze for PropertyValueCountTrigger<E, P>
where P: Freeze,

§

impl<E, P> RefUnwindSafe for PropertyValueCountTrigger<E, P>
where P: RefUnwindSafe,

§

impl<E, P> Send for PropertyValueCountTrigger<E, P>
where P: Send,

§

impl<E, P> Sync for PropertyValueCountTrigger<E, P>
where P: Sync,

§

impl<E, P> Unpin for PropertyValueCountTrigger<E, P>
where P: Unpin,

§

impl<E, P> UnsafeUnpin for PropertyValueCountTrigger<E, P>
where P: UnsafeUnpin,

§

impl<E, P> UnwindSafe for PropertyValueCountTrigger<E, P>
where P: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
§

impl<T> Pointee for T

§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.