RcConditionalMutator

Struct RcConditionalMutator 

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

RcConditionalMutator struct

A single-threaded conditional mutator that only executes when a predicate is satisfied. Uses RcMutator and RcPredicate for shared ownership within a single thread.

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

§Features

  • Shared Ownership: Cloneable via Rc, multiple owners allowed
  • Single-Threaded: Not thread-safe, cannot be sent across threads
  • Conditional Execution: Only mutates when predicate returns true
  • No Lock Overhead: More efficient than ArcConditionalMutator

§Examples

use prism3_function::{Mutator, RcMutator};

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

let conditional_clone = conditional.clone();

let mut value = 5;
let mut m = conditional;
m.apply(&mut value);
assert_eq!(value, 10);

§Author

Haixing Hu

Implementations§

Source§

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

Source

pub fn and_then<M>(&self, next: M) -> RcMutator<T>
where M: Mutator<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 = ArcMutator::new(|x: &mut i32| {
    *x += 1;
});

let mutator2 = ArcMutator::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) -> RcMutator<T>
where M: Mutator<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> Clone for RcConditionalMutator<T>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T> Debug for RcConditionalMutator<T>

Source§

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

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

impl<T> Display for RcConditionalMutator<T>

Source§

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

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

impl<T> Mutator<T> for RcConditionalMutator<T>
where T: 'static,

Source§

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

Performs the stateless mutation operation Read more
Source§

fn into_box(self) -> BoxMutator<T>

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

fn into_rc(self) -> RcMutator<T>

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

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

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

fn into_arc(self) -> ArcMutator<T>
where Self: Sized + Send + Sync + '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
Source§

fn to_box(&self) -> BoxMutator<T>
where Self: Sized + Clone + 'static, T: 'static,

Create a non-consuming BoxMutator<T> that forwards to self. Read more
Source§

fn to_rc(&self) -> RcMutator<T>
where Self: Sized + Clone + 'static, T: 'static,

Create a non-consuming RcMutator<T> that forwards to self. Read more
Source§

fn to_arc(&self) -> ArcMutator<T>
where Self: Sized + Clone + Send + Sync + 'static, T: Send + 'static,

Create a non-consuming ArcMutator<T> that forwards to self. Read more
Source§

fn to_fn(&self) -> impl Fn(&mut T)
where Self: Sized + Clone + 'static, T: 'static,

Create a boxed Fn(&mut T) closure that forwards to self. Read more
Source§

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

Create a non-consuming BoxMutatorOnce<T> that forwards to self. 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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.