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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
//! Effect Commutativity
//!
//! This module defines when effects can be safely reordered. Two effects
//! commute if executing them in either order produces the same result.
//!
//! # Commutativity Rules
//!
//! ```text
//! Effect 1 | Effect 2 | Commutes? | Reason
//! ------------|-------------|-----------|--------
//! Reader<A> | Reader<B> | Yes | Both read-only
//! Reader<A> | Writer<B> | Yes | Read doesn't see write
//! Reader<A> | State<S> | No | State may change env
//! Reader<A> | Error<E> | Yes | Error doesn't affect read
//! Writer<A> | Writer<B> | Yes* | If monoid is commutative
//! State<S> | State<S> | No | Order matters for same state
//! State<S> | State<T> | Yes | Different state types
//! Error<E> | Error<E> | No | First error wins
//! IO | IO | No | Side effects don't commute
//! Pure | Anything | Yes | Pure has no effects
//! ```
//!
//! # Usage
//!
//! Effect commutativity is used by **explicit optimization combinators** to:
//! - Validate that operations can be safely reordered
//! - Type-check parallel execution (`par_both`, etc.)
//! - Enforce fusion safety (`fuse_commutative`)
//!
//! **Note:** There is no automatic optimizer. Users must explicitly call
//! combinators that leverage commutativity.
use PhantomData;
use crate;
use crateWriterEffect;
use crate;
// =============================================================================
// Commutativity Marker Traits
// =============================================================================
/// Marker for commutative relationships.
;
/// Marker for non-commutative relationships.
;
// =============================================================================
// Effect Commutativity Trait
// =============================================================================
/// Trait indicating that two effects commute.
///
/// If `E1: EffectCommutes<E2>`, then computations with effect E1 can be
/// reordered with computations with effect E2 without changing semantics.
///
/// # Safety
///
/// Incorrectly implementing this trait can lead to incorrect program behavior.
/// Only implement this if you're certain the effects truly commute.
///
/// # Example
///
/// ```rust
/// use ordofp_core::nexus::Reader;
/// use ordofp_core::nexus::optim::commutativity::{Commutative, EffectCommutes};
///
/// // Reader effects commute with each other (already proven by the crate: see
/// // `impl<A, B> EffectCommutes<Reader<B>> for Reader<A>`).
/// fn assert_reader_commutes<A, B>()
/// where
/// Reader<A>: EffectCommutes<Reader<B>, Witness = Commutative>,
/// {
/// }
///
/// // This enables parallel execution via combinators like `par_both`:
/// assert_reader_commutes::<i32, &str>();
/// ```
// =============================================================================
// Pure Commutes with Everything
// =============================================================================
/// Pure effects commute with any effect.
// =============================================================================
// Reader Commutativity
// =============================================================================
/// Reader effects commute with each other (read-only).
/// Reader commutes with Error (error doesn't affect reading).
/// Reader commutes with Writer (read doesn't see concurrent write).
// =============================================================================
// Error Commutativity
// =============================================================================
/// Error commutes with Reader.
// Note: Error<E> does NOT commute with Error<E> because the first error wins.
// =============================================================================
// Writer Commutativity
// =============================================================================
/// Writer commutes with Reader.
// Note: Writer<W> commutes with Writer<W> only if W's monoid is commutative.
// This requires additional type-level evidence.
// =============================================================================
// Commutativity Proofs
// =============================================================================
/// Type-level proof that two effect rows commute.
/// Check if two effect rows commute at compile time.
/// Pure row commutes with everything.
// =============================================================================
// Commutativity Combinators
// =============================================================================
/// Swap the order of two computations if they commute.
///
/// This is the foundation for parallel execution and reordering optimizations.
///
/// # Example
///
/// ```rust
/// use ordofp_core::nexus::optim::commutativity::{swap_if_commutes, RowsCommute};
/// use ordofp_core::nexus::Pure;
///
/// // SAFETY: two `Pure` rows trivially commute (no ordering constraints).
/// let proof = unsafe { RowsCommute::<Pure, Pure>::new() };
///
/// // These two values (standing in for two commuting computations) can be swapped
/// let (b, a) = swap_if_commutes(proof, 1, 2);
/// assert_eq!(a, 1);
/// assert_eq!(b, 2);
/// ```
// =============================================================================
// Effect Independence
// =============================================================================
/// Two effects are independent if they access disjoint resources.
///
/// Independent effects can always be executed in parallel, even if they
/// don't strictly commute (e.g., two State effects on different state types).
/// Different state types are independent.
/// Reader and State with different types are independent.
// =============================================================================
// Tests
// =============================================================================