pub struct RcReadonlyConsumer<T> { /* private fields */ }Expand description
RcReadonlyConsumer 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 RcReadonlyConsumer when:
- Need to share readonly consumer within a single thread
- Pure observation operations, performance critical
- Event handling in single-threaded UI frameworks
§Performance Advantages
RcReadonlyConsumer 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::{ReadonlyConsumer, RcReadonlyConsumer};
let consumer = RcReadonlyConsumer::new(|x: &i32| {
println!("Observed: {}", x);
});
let clone = consumer.clone();
consumer.accept(&5);
clone.accept(&10);§Author
Hu Haixing
Implementations§
Source§impl<T> RcReadonlyConsumer<T>where
T: 'static,
impl<T> RcReadonlyConsumer<T>where
T: 'static,
Sourcepub fn new<F>(f: F) -> Self
pub fn new<F>(f: F) -> Self
Create a new RcReadonlyConsumer
§Type Parameters
F- Closure type
§Parameters
f- Closure to wrap
§Returns
Returns a new RcReadonlyConsumer<T> instance
§Examples
use prism3_function::{ReadonlyConsumer, RcReadonlyConsumer};
let consumer = RcReadonlyConsumer::new(|x: &i32| {
println!("Value: {}", x);
});
consumer.accept(&5);Sourcepub fn to_fn(&self) -> impl Fn(&T)where
T: 'static,
pub fn to_fn(&self) -> impl Fn(&T)where
T: 'static,
Convert to closure (without consuming self)
Creates a new closure that calls the underlying function through Rc.
§Returns
Returns a closure implementing Fn(&T)
§Examples
use prism3_function::{ReadonlyConsumer, RcReadonlyConsumer};
let consumer = RcReadonlyConsumer::new(|x: &i32| {
println!("Value: {}", x);
});
let func = consumer.to_fn();
func(&5);Sourcepub fn and_then(&self, next: &RcReadonlyConsumer<T>) -> RcReadonlyConsumer<T>
pub fn and_then(&self, next: &RcReadonlyConsumer<T>) -> RcReadonlyConsumer<T>
Sequentially chain another RcReadonlyConsumer
Returns a new consumer that executes the current operation first, then the next operation. Borrows &self, does not consume the original consumer.
§Parameters
next- Consumer to execute after the current operation. Note: This parameter is passed by reference, so the original consumer remains usable. Can be:- An
RcReadonlyConsumer<T>(passed by reference) - Any type implementing
ReadonlyConsumer<T>
- An
§Returns
Returns a new combined RcReadonlyConsumer<T>
§Examples
use prism3_function::{ReadonlyConsumer, RcReadonlyConsumer};
let first = RcReadonlyConsumer::new(|x: &i32| {
println!("First: {}", x);
});
let second = RcReadonlyConsumer::new(|x: &i32| {
println!("Second: {}", x);
});
// second is passed by reference, so it remains usable
let chained = first.and_then(&second);
// first and second remain usable after chaining
chained.accept(&5);
first.accept(&3); // Still usable
second.accept(&7); // Still usable