transformer_once_demo/
transformer_once_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025.
4 *    3-Prism Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9
10//! # TransformerOnce Demo
11//!
12//! Demonstrates TransformerOnce implementation for BoxTransformer, RcTransformer, and ArcTransformer
13//!
14//! # Author
15//!
16//! Hu Haixing
17
18use prism3_function::{ArcTransformer, BoxTransformer, RcTransformer, TransformerOnce};
19use std::sync::Arc;
20use std::thread;
21
22fn main() {
23    println!("=== TransformerOnce Demo ===\n");
24
25    // BoxTransformer TransformerOnce demonstration
26    println!("1. BoxTransformer TransformerOnce demonstration:");
27    let double = BoxTransformer::new(|x: i32| x * 2);
28    let result = double.apply_once(21);
29    println!("   double.apply_once(21) = {}", result);
30
31    // Convert to BoxTransformerOnce
32    let double = BoxTransformer::new(|x: i32| x * 2);
33    let boxed = double.into_box_once();
34    let result = boxed.apply_once(21);
35    println!("   double.into_box_once().apply_once(21) = {}", result);
36
37    // Convert to function
38    let double = BoxTransformer::new(|x: i32| x * 2);
39    let func = double.into_fn_once();
40    let result = func(21);
41    println!("   double.into_fn_once()(21) = {}", result);
42
43    println!();
44
45    // RcTransformer TransformerOnce demonstration
46    println!("2. RcTransformer TransformerOnce demonstration:");
47    let uppercase = RcTransformer::new(|s: String| s.to_uppercase());
48    let result = uppercase.apply_once("hello".to_string());
49    println!("   uppercase.apply_once(\"hello\") = {}", result);
50
51    // Use after cloning
52    let uppercase = RcTransformer::new(|s: String| s.to_uppercase());
53    let uppercase_clone = uppercase.clone();
54    let result1 = uppercase.apply_once("world".to_string());
55    let result2 = uppercase_clone.apply_once("rust".to_string());
56    println!("   uppercase.apply_once(\"world\") = {}", result1);
57    println!("   uppercase_clone.apply_once(\"rust\") = {}", result2);
58
59    println!();
60
61    // ArcTransformer TransformerOnce demonstration
62    println!("3. ArcTransformer TransformerOnce demonstration:");
63    let parse_and_double = ArcTransformer::new(|s: String| s.parse::<i32>().unwrap_or(0) * 2);
64    let result = parse_and_double.apply_once("21".to_string());
65    println!("   parse_and_double.apply_once(\"21\") = {}", result);
66
67    // Thread safety demonstration
68    println!("4. ArcTransformer thread safety demonstration:");
69    let double = ArcTransformer::new(|x: i32| x * 2);
70    let double_arc = Arc::new(double);
71    let _double_clone = Arc::clone(&double_arc);
72
73    let handle = thread::spawn(move || {
74        // Create a new transformer in the thread to demonstrate thread safety
75        let new_double = ArcTransformer::new(|x: i32| x * 2);
76        new_double.apply_once(21)
77    });
78
79    let result = handle.join().unwrap();
80    println!(
81        "   Executed in thread: new_double.apply_once(21) = {}",
82        result
83    );
84
85    println!("\n=== Demo completed ===");
86}