BoxConditionalStatefulMutator

Struct BoxConditionalStatefulMutator 

Source
pub struct BoxConditionalStatefulMutator<T> { /* private fields */ }
Expand description

BoxConditionalMutator struct

A conditional mutator that only executes when a predicate is satisfied. Uses BoxMutator and BoxPredicate for single ownership semantics.

This type is typically created by calling BoxMutator::when() and is designed to work with the or_else() method to create if-then-else logic.

§Features

  • Single Ownership: Not cloneable, consumes self on use
  • Conditional Execution: Only mutates when predicate returns true
  • Chainable: Can add or_else branch to create if-then-else logic
  • Implements Mutator: Can be used anywhere a Mutator is expected

§Examples

§Basic Conditional Execution

use prism3_function::{Mutator, BoxMutator};

let mutator = BoxMutator::new(|x: &mut i32| *x *= 2);
let mut conditional = mutator.when(|x: &i32| *x > 0);

let mut positive = 5;
conditional.apply(&mut positive);
assert_eq!(positive, 10); // Executed

let mut negative = -5;
conditional.apply(&mut negative);
assert_eq!(negative, -5); // Not executed

§With or_else Branch

use prism3_function::{Mutator, BoxMutator};

let mut mutator = BoxMutator::new(|x: &mut i32| *x *= 2)
    .when(|x: &i32| *x > 0)
    .or_else(|x: &mut i32| *x -= 1);

let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10); // when branch executed

let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, -6); // or_else branch executed

§Author

Haixing Hu

Implementations§

Source§

impl<T> BoxConditionalStatefulMutator<T>
where T: 'static,

Source

pub fn and_then<M>(self, next: M) -> BoxStatefulMutator<T>
where M: StatefulMutator<T> + 'static,

Chains another mutator in sequence

Combines the current conditional mutator with another mutator into a new mutator that implements the following semantics:

When the returned mutator is called with an argument:

  1. First, it checks the predicate of this conditional mutator
  2. If the predicate is satisfied, it executes the internal mutator of this conditional mutator
  3. Then, regardless of whether the predicate was satisfied, it unconditionally executes the next mutator

In other words, this creates a mutator that conditionally executes the first action (based on the predicate), and then always executes the second action.

§Parameters
  • next - The next mutator to execute (always executed)
§Returns

Returns a new combined mutator

§Examples
use std::sync::atomic::{AtomicI32, Ordering};

let result = AtomicI32::new(0);

let mutator1 = BoxMutator::new(|x: &mut i32| {
    *x += 1;
});

let mutator2 = BoxMutator::new(|x: &mut i32| {
    *x += 2;
});

let conditional = mutator1.when(|x| *x > 0);
let chained = conditional.and_then(mutator2);

let mut val = 5;
chained.apply(&mut val);  // val = 5 + 1 + 2 = 8
let mut val2 = -1;
chained.apply(&mut val2); // val2 = -1 + 2 = 1 (not -1 + 1 + 2!)
Source

pub fn or_else<M>(self, else_mutator: M) -> BoxStatefulMutator<T>
where M: StatefulMutator<T> + 'static,

Adds an else branch

Executes the original mutator when the condition is satisfied, otherwise executes else_mutator.

§Parameters
  • else_mutator - The mutator for the else branch
§Returns

Returns a new mutator with if-then-else logic

Trait Implementations§

Source§

impl<T> Debug for BoxConditionalStatefulMutator<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> Display for BoxConditionalStatefulMutator<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> StatefulMutator<T> for BoxConditionalStatefulMutator<T>
where T: 'static,

Source§

fn apply(&mut self, value: &mut T)

Performs the mutation operation Read more
Source§

fn into_box(self) -> BoxStatefulMutator<T>

Convert this mutator into a BoxMutator<T>. Read more
Source§

fn into_rc(self) -> RcStatefulMutator<T>

Convert this mutator into an RcMutator<T>. Read more
Source§

fn into_fn(self) -> impl FnMut(&mut T)

Consume the mutator and return an FnMut(&mut T) closure. Read more
Source§

fn into_arc(self) -> ArcStatefulMutator<T>
where Self: Sized + Send + 'static, T: Send + 'static,

Convert this mutator into an ArcMutator<T>. Read more
Source§

fn into_once(self) -> BoxMutatorOnce<T>
where Self: Sized + 'static, T: 'static,

Convert this mutator into a BoxMutatorOnce<T> (consuming). Read more

Auto Trait Implementations§

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
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.

Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
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.