Skip to main content

transformer_once_demo/
transformer_once_demo.rs

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