pub struct RcConsumer<T> { /* private fields */ }Expand description
RcConsumer struct
Readonly consumer implementation based on Rc<dyn Fn(&T)> for
single-threaded shared ownership scenarios. No RefCell needed because
operations are readonly.
§Features
- Shared Ownership: Cloneable through
Rc, allows multiple owners - Single-threaded: Not thread-safe, cannot be sent across threads
- No Interior Mutability Overhead: No RefCell needed because it’s readonly
- Non-consuming API:
and_thenborrows&self, original object remains usable
§Use Cases
Choose RcConsumer when:
- Need to share readonly consumer within a single thread
- Pure observation operations, performance critical
- Event handling in single-threaded UI frameworks
§Performance Advantages
RcConsumer has neither Arc’s atomic operation overhead nor
RefCell’s runtime borrow checking overhead, making it the most performant of
the three readonly consumers.
§Examples
use prism3_function::{Consumer, RcConsumer};
let consumer = RcConsumer::new(|x: &i32| {
println!("Observed: {}", x);
});
let clone = consumer.clone();
consumer.accept(&5);
clone.accept(&10);§Author
Haixing Hu
Implementations§
Source§impl<T> RcConsumer<T>where
T: 'static,
impl<T> RcConsumer<T>where
T: 'static,
Sourcepub fn new<F>(f: F) -> Self
pub fn new<F>(f: F) -> Self
Creates a new consumer.
Wraps the provided closure in the appropriate smart pointer type for this consumer implementation.
Sourcepub fn new_with_name<F>(name: &str, f: F) -> Self
pub fn new_with_name<F>(name: &str, f: F) -> Self
Creates a new named consumer.
Wraps the provided closure and assigns it a name, which is useful for debugging and logging purposes.
Sourcepub fn new_with_optional_name<F>(f: F, name: Option<String>) -> Self
pub fn new_with_optional_name<F>(f: F, name: Option<String>) -> Self
Creates a new named consumer with an optional name.
Wraps the provided closure and assigns it an optional name.
Sourcepub fn noop() -> Self
pub fn noop() -> Self
Creates a no-operation consumer.
Creates a consumer that does nothing when called. Useful for default values or placeholder implementations.
§Returns
Returns a new consumer instance that performs no operation.
Sourcepub fn when<P>(&self, predicate: P) -> RcConditionalConsumer<T>where
P: Predicate<T> + 'static,
pub fn when<P>(&self, predicate: P) -> RcConditionalConsumer<T>where
P: Predicate<T> + 'static,
Creates a conditional consumer
Wraps this consumer with a predicate condition, creating a new conditional consumer that will only execute the original consumer when the predicate evaluates to true.
§Parameters
predicate- The condition that must be satisfied for the consumer to execute
§Returns
Returns a conditional consumer that executes this consumer only when the predicate is satisfied
§Examples
let consumer = ArcConsumer::new(|x: &i32| println!("{}", x));
let conditional = consumer.when(|x| *x > 0);
conditional.accept(&5); // prints: 5
conditional.accept(&-5); // prints nothingSourcepub fn and_then<C>(&self, after: C) -> RcConsumer<T>where
T: 'static,
C: Consumer<T> + 'static,
pub fn and_then<C>(&self, after: C) -> RcConsumer<T>where
T: 'static,
C: Consumer<T> + 'static,
Chains another consumer in sequence
Combines this consumer with another consumer into a new consumer
that executes both consumers in sequence. The returned consumer
first executes this consumer, then unconditionally executes the
after consumer.
§Parameters
after- The consumer to execute after this one (always executed)
§Returns
Returns a new consumer that executes both consumers in sequence
§Examples
let consumer1 = ArcConsumer::new(|x: &i32| print!("first: {}", x));
let consumer2 = ArcConsumer::new(|x: &i32| println!(" second: {}", x));
let chained = consumer1.and_then(consumer2);
chained.accept(&5); // prints: first: 5 second: 5Trait Implementations§
Source§impl<T> Clone for RcConsumer<T>
impl<T> Clone for RcConsumer<T>
Source§impl<T> Consumer<T> for RcConsumer<T>
impl<T> Consumer<T> for RcConsumer<T>
Source§fn into_box(self) -> BoxConsumer<T>where
T: 'static,
fn into_box(self) -> BoxConsumer<T>where
T: 'static,
Source§fn into_rc(self) -> RcConsumer<T>where
T: 'static,
fn into_rc(self) -> RcConsumer<T>where
T: 'static,
Source§fn to_box(&self) -> BoxConsumer<T>where
T: 'static,
fn to_box(&self) -> BoxConsumer<T>where
T: 'static,
BoxConsumer Read moreSource§fn to_rc(&self) -> RcConsumer<T>where
T: 'static,
fn to_rc(&self) -> RcConsumer<T>where
T: 'static,
RcConsumer Read more