Skip to main content

qubit_function/transformers/bi_transformer/
box_bi_transformer.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9//! Defines the `BoxBiTransformer` public type.
10
11#![allow(unused_imports)]
12
13use super::*;
14
15// ============================================================================
16// BoxBiTransformer - Box<dyn Fn(T, U) -> R>
17// ============================================================================
18
19/// BoxBiTransformer - bi-transformer wrapper based on `Box<dyn Fn>`
20///
21/// A bi-transformer wrapper that provides single ownership with reusable
22/// transformation. The bi-transformer consumes both inputs and can be called
23/// multiple times.
24///
25/// # Features
26///
27/// - **Based on**: `Box<dyn Fn(T, U) -> R>`
28/// - **Ownership**: Single ownership, cannot be cloned
29/// - **Reusability**: Can be called multiple times (each call consumes its
30///   inputs)
31/// - **Thread Safety**: Not thread-safe (no `Send + Sync` requirement)
32///
33/// # Author
34///
35/// Haixing Hu
36pub struct BoxBiTransformer<T, U, R> {
37    pub(super) function: Box<dyn Fn(T, U) -> R>,
38    pub(super) name: Option<String>,
39}
40
41// Implement BoxBiTransformer
42impl<T, U, R> BoxBiTransformer<T, U, R> {
43    impl_transformer_common_methods!(
44        BoxBiTransformer<T, U, R>,
45        (Fn(T, U) -> R + 'static),
46        |f| Box::new(f)
47    );
48
49    impl_box_transformer_methods!(
50        BoxBiTransformer<T, U, R>,
51        BoxConditionalBiTransformer,
52        Transformer
53    );
54}
55
56// Implement constant method for BoxBiTransformer
57impl_transformer_constant_method!(BoxBiTransformer<T, U, R>);
58
59// Implement Debug and Display for BoxBiTransformer
60impl_transformer_debug_display!(BoxBiTransformer<T, U, R>);
61
62// Implement BiTransformer trait for BoxBiTransformer
63impl<T, U, R> BiTransformer<T, U, R> for BoxBiTransformer<T, U, R> {
64    fn apply(&self, first: T, second: U) -> R {
65        (self.function)(first, second)
66    }
67
68    // Generates: into_box(), into_rc(), into_fn(), into_once()
69    impl_box_conversions!(
70        BoxBiTransformer<T, U, R>,
71        RcBiTransformer,
72        Fn(T, U) -> R,
73        BoxBiTransformerOnce
74    );
75}