- | Just (co1, co2) <- splitAppCoercion_maybe co
- -- should make this case better
- = mkAppCoercion (mkSymCoercion co1) (mkSymCoercion co2)
+ -- sym (sym co) --> co
+ | Just (co1, arg_tys) <- splitTyConApp_maybe co
+ , not (isCoercionTyCon co1) = mkTyConApp co1 (map mkSymCoercion arg_tys)
+ -- we can drop the sym for a TyCon
+ -- sym (ty [t1, ..., tn]) --> ty [sym t1, ..., sym tn]
+ | (co1, arg_tys) <- splitAppTys co
+ , isTyVarTy co1 = mkAppTys (maybe_drop co1) (map mkSymCoercion arg_tys)
+ -- sym (tv [t1, ..., tn]) --> tv [sym t1, ..., sym tn]
+ -- if tv type variable
+ -- sym (cv [t1, ..., tn]) --> (sym cv) [sym t1, ..., sym tn]
+ -- if cv is a coercion variable
+ -- fall through if head is a CoercionTyCon