1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// =============================================================================
// Copyright (c) 2025 - 2026 Haixing Hu.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0.
// =============================================================================
//! # Shared Mutator Methods Macro
//!
//! Generates `when` and `and_then` for shared Arc/Rc mutators.
//! The generated methods borrow `&self`, clone the shared wrapper, and keep
//! predicate-storage capabilities separate from chained-callback
//! capabilities.
//!
//! # Parameters
//!
//! * `$struct_name<$generics>` - Mutator wrapper type.
//! * `$return_type` - Conditional wrapper returned by `when`, such as
//! `ArcConditionalMutator`.
//! * `$predicate_type` - Predicate wrapper used by the conditional result.
//! * `$mutator_trait` - Semantic trait implemented by the chained callback,
//! such as `Mutator`.
//! * `$predicate_bounds` - Bounds required to store the predicate wrapper.
//! * `$chained_bounds` - Bounds required to store the callback produced by
//! `and_then`.
//!
//! # Capability policy
//!
//! | Wrapper family | `predicate_bounds` | `chained_bounds` |
//! |----------------|--------------------|------------------|
//! | Arc stateless | `Send + Sync + 'static` | `Send + Sync + 'static` |
//! | Arc stateful | `Send + Sync + 'static` | `Send + 'static` |
//! | Rc stateless/stateful | `'static` | `'static` |
/// Generates `when` and `and_then` for shared Arc/Rc mutators.
///
/// Invoke this macro inside the target wrapper's `impl` block. Predicate
/// bounds describe the immutable predicate object stored by the conditional
/// wrapper. Chained bounds describe the callback stored by the returned
/// mutator; stateful Arc callbacks are serialized by their outer
/// mutex and therefore require `Send`, but not `Sync`.
///
/// # Capability policy
///
/// | Wrapper family | `predicate_bounds` | `chained_bounds` |
/// |----------------|--------------------|------------------|
/// | Arc stateless | `Send + Sync + 'static` | `Send + Sync + 'static` |
/// | Arc stateful | `Send + Sync + 'static` | `Send + 'static` |
/// | Rc stateless/stateful | `'static` | `'static` |
}
/// Chains execution with another mutator, executing the current
/// mutator first, then the subsequent mutator.
///
/// # Parameters
///
/// * `after` - The subsequent mutator to execute after the current
/// mutator completes
///
/// # Returns
///
/// Returns a new mutator that executes the current mutator and
/// the subsequent mutator in sequence.
///
/// # Examples
///
/// ```rust
/// use std::sync::Arc;
/// use std::sync::atomic::{AtomicI32, Ordering};
/// use qubit_function::mutators::*;
///
/// let counter1 = Arc::new(AtomicI32::new(0));
/// let counter2 = Arc::new(AtomicI32::new(0));
///
/// let mutator1 = ArcMutator::new({
/// let counter = Arc::clone(&counter1);
/// move |value: &mut i32| {
/// *value += counter.fetch_add(1, Ordering::SeqCst);
/// }
/// });
///
/// let mutator2 = ArcMutator::new({
/// let counter = Arc::clone(&counter2);
/// move |value: &mut i32| {
/// *value += counter.fetch_add(1, Ordering::SeqCst);
/// }
/// });
///
/// let chained = mutator1.and_then(mutator2);
/// let mut val = 0;
/// chained.apply(&mut val);
/// // val = 2 (0 + 1 + 1)
/// ```
};
}
pub use impl_shared_mutator_methods;