Skip to main content

qubit_function/transformers/transformer/
arc_transformer.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// qubit-style: allow explicit-imports
11//! Defines the `ArcTransformer` public type.
12
13use super::{
14    Arc,
15    ArcConditionalTransformer,
16    BoxTransformer,
17    BoxTransformerOnce,
18    Predicate,
19    RcTransformer,
20    Transformer,
21    impl_arc_conversions,
22    impl_closure_trait,
23    impl_shared_transformer_methods,
24    impl_transformer_clone,
25    impl_transformer_common_methods,
26    impl_transformer_constant_method,
27    impl_transformer_debug_display,
28};
29
30// ============================================================================
31// ArcTransformer - Arc<dyn Fn(T) -> R + Send + Sync>
32// ============================================================================
33
34/// ArcTransformer - thread-safe transformer wrapper
35///
36/// A thread-safe, clonable transformer wrapper suitable for multi-threaded
37/// scenarios. Can be called multiple times and shared across threads.
38///
39/// # Features
40///
41/// - **Based on**: `Arc<dyn Fn(T) -> R + Send + Sync>`
42/// - **Ownership**: Shared ownership via reference counting
43/// - **Reusability**: Can be called multiple times (each call consumes its
44///   input)
45/// - **Thread Safety**: Thread-safe (`Send + Sync` required)
46/// - **Clonable**: Cheap cloning via `Arc::clone`
47///
48pub struct ArcTransformer<T, R> {
49    pub(super) function: Arc<dyn Fn(T) -> R + Send + Sync>,
50    pub(super) name: Option<String>,
51}
52
53// Implement ArcTransformer
54impl<T, R> ArcTransformer<T, R> {
55    impl_transformer_common_methods!(
56        ArcTransformer<T, R>,
57        (Fn(T) -> R + Send + Sync + 'static),
58        |f| Arc::new(f)
59    );
60
61    impl_shared_transformer_methods!(
62        ArcTransformer<T, R>,
63        ArcConditionalTransformer,
64        into_arc,
65        Transformer,
66        Send + Sync + 'static
67    );
68}
69
70// Implement constant method for ArcTransformer
71impl_transformer_constant_method!(thread_safe ArcTransformer<T, R>);
72
73// Implement Debug and Display for ArcTransformer
74impl_transformer_debug_display!(ArcTransformer<T, R>);
75
76// Implement Clone for ArcTransformer
77impl_transformer_clone!(ArcTransformer<T, R>);
78
79// Implement Transformer for ArcTransformer
80impl<T, R> Transformer<T, R> for ArcTransformer<T, R> {
81    fn apply(&self, input: T) -> R {
82        (self.function)(input)
83    }
84
85    // Use macro to implement conversion methods
86    impl_arc_conversions!(
87        ArcTransformer<T, R>,
88        BoxTransformer,
89        RcTransformer,
90        BoxTransformerOnce,
91        Fn(t: T) -> R
92    );
93}
94
95// ============================================================================
96// Blanket implementation for standard Fn trait
97// ============================================================================
98
99// Implement Transformer<T, R> for any type that implements Fn(T) -> R
100impl_closure_trait!(
101    Transformer<T, R>,
102    apply,
103    BoxTransformerOnce,
104    Fn(input: T) -> R
105);