BoxConditionalConsumer

Struct BoxConditionalConsumer 

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

BoxConditionalConsumer struct

A conditional readonly consumer that only executes when a predicate is satisfied. Uses BoxConsumer and BoxPredicate for single ownership semantics.

This type is typically created by calling BoxConsumer::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 consumes when predicate returns true
  • Chainable: Can add or_else branch to create if-then-else logic
  • Implements Consumer: Can be used anywhere a Consumer is expected
  • Readonly: Neither modifies itself nor input values

§Examples

§Basic Conditional Execution

use prism3_function::{Consumer, BoxConsumer};

let consumer = BoxConsumer::new(|x: &i32| {
    println!("Positive: {}", x);
});
let conditional = consumer.when(|x: &i32| *x > 0);

conditional.accept(&5);  // Prints: Positive: 5
conditional.accept(&-5); // Does nothing

§With or_else Branch

use prism3_function::{Consumer, BoxConsumer};

let consumer = BoxConsumer::new(|x: &i32| {
    println!("Positive: {}", x);
})
.when(|x: &i32| *x > 0)
.or_else(|x: &i32| {
    println!("Non-positive: {}", x);
});

consumer.accept(&5);  // Prints: Positive: 5
consumer.accept(&-5); // Prints: Non-positive: -5

§Author

Haixing Hu

Implementations§

Source§

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

Source

pub fn and_then<C>(self, next: C) -> BoxConsumer<T>
where C: Consumer<T> + 'static,

Chains another consumer in sequence

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

When the returned consumer is called with an argument:

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

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

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

Returns a new combined consumer

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

let result = AtomicI32::new(0);

let consumer1 = BoxConsumer::new(|x: &i32| {
    result.fetch_add(*x, Ordering::SeqCst);
});

let consumer2 = BoxConsumer::new(|x: &i32| {
    result.fetch_add(2 * (*x), Ordering::SeqCst);
});

let conditional = consumer1.when(|x| *x > 0);
let chained = conditional.and_then(consumer2);

chained.accept(&5);  // result = 5 + (2*5) = 15
result.store(0, Ordering::SeqCst);  // reset
chained.accept(&-5); // result = 0 + (2*-5) = -10 (not -15!)
Source

pub fn or_else<C>(self, else_consumer: C) -> BoxConsumer<T>
where C: Consumer<T> + 'static,

Adds an else branch

Executes the original consumer when the condition is satisfied, otherwise executes else_consumer.

§Parameters
  • else_consumer - The consumer for the else branch
§Returns

Returns a new consumer with if-then-else logic

Trait Implementations§

Source§

impl<T> Consumer<T> for BoxConditionalConsumer<T>
where T: 'static,

Source§

fn accept(&self, value: &T)

Execute readonly consumption operation Read more
Source§

fn into_box(self) -> BoxConsumer<T>

Convert to BoxConsumer Read more
Source§

fn into_rc(self) -> RcConsumer<T>

Convert to RcConsumer Read more
Source§

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

Convert to closure Read more
Source§

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

Convert to ArcConsumer Read more
Source§

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

Convert to ConsumerOnce Read more
Source§

impl<T> Debug for BoxConditionalConsumer<T>

Source§

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

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

impl<T> Display for BoxConditionalConsumer<T>

Source§

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

Formats the value using the given formatter. 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.