By: Tom Sydney Kerckhove <syd@cs-syd.eu>
Mutation: TupleSwap operator (swap two same-typed tuple components) For a boxed tuple whose two components share a type, emit one mutant per same-typed pair that swaps that pair. This is the tuple-syntax counterpart to SwitchFunctionArguments, which only walks application spines and so never reaches the ExplicitTuple node. Mirrors that operator's honesty restrictions: tuple sections (which carry a Missing component and are really functions) are skipped, and so are pairs with identical source text (whose swap is an unkillable no-op). No application-depth guard is needed -- each ExplicitTuple is visited once and nested tuples are distinct nodes with distinct spans. Only boxed tuples are mutated. An unboxed tuple's type has kind TYPE (TupleRep ...), not Type, but the ifMutation wrapper the plugin places around every mutant is monomorphic in a lifted type. Wrapping an unboxed tuple builds an ill-kinded application that GHC miscompiles into a binary that aborts at runtime (SIGABRT), so unboxed tuples are excluded outright. The unboxedPair regression in Example.TupleSwapLib pins this.