ee3784cc

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.