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);