Skip to main content

transformer_once_demo/
transformer_once_demo.rs

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