Dispatch layer for product-typed operations. Single entry point for Prod-side toRepresentation. Routing typegens (ProductCase*, OneElementWrapperEmitter) extend the base SirTypeUplcGenerator only — they don't have toRepresentation at all, so direct calls are compile-time errors. See docs/local/claude/compiler/sum-prod-dispatch-design.md.
Representation-aware dispatch for product-typed genMatch. Mirror of SumDispatch.genMatch:
Representation-aware dispatch for product-typed genMatch. Mirror of SumDispatch.genMatch:
(Prod|Sum)UplcConstr → tag-ordered Case via genMatchUplcConstr.
ProdDataList / ProdDataConstr / PackedDataList / PairIntDataList → ProdDataListOps.genMatch (Data-shape extraction via unConstrData + headList/tailList, or just field projection).
ProdBuiltinPair(_, _) → ProdBuiltinPairOps.genMatch (Case on Pair for V4+, fstPair/sndPair for V1-V3).
OneElementWrapper(_) → fall through to the per-type OneElementWrapperEmitter instance — its genMatch captures argType-specific binding extraction.
TypeVarRepresentation(_) → relabel to the type's defaultTypeVarRepresentation and recurse.
everything else → fall back to the type-keyed typegen's genMatch.
Pre-Phase-4c-step-2 this dispatch was inlined in ProductCaseUplcConstrEmitter.genMatch and ProductCaseEmitter.genMatch; consolidating it here mirrors Phase 4a on the Sum side.