-splitSigmaTy :: GenType flexi -> ([GenTyVar flexi], [(Class, [GenType flexi])], GenType flexi)
-splitSigmaTy ty =
- (tyvars, theta, tau)
- where
- (tyvars,rho) = splitForAllTys ty
- (theta,tau) = splitRhoTy rho
+Source types are always lifted.
+
+The key function is sourceTypeRep which gives the representation of a source type:
+
+\begin{code}
+mkPredTy :: PredType -> Type
+mkPredTy pred = SourceTy pred
+
+mkPredTys :: ThetaType -> [Type]
+mkPredTys preds = map SourceTy preds
+
+sourceTypeRep :: SourceType -> Type
+-- Convert a predicate to its "representation type";
+-- the type of evidence for that predicate, which is actually passed at runtime
+sourceTypeRep (IParam n ty) = ty
+sourceTypeRep (ClassP clas tys) = mkTyConApp (classTyCon clas) tys
+ -- Note the mkTyConApp; the classTyCon might be a newtype!
+sourceTypeRep (NType tc tys) = newTypeRep tc tys
+ -- ToDo: Consider caching this substitution in a NType
+
+isSourceTy :: Type -> Bool
+isSourceTy (NoteTy _ ty) = isSourceTy ty
+isSourceTy (UsageTy _ ty) = isSourceTy ty
+isSourceTy (SourceTy sty) = True
+isSourceTy _ = False
+
+
+splitNewType_maybe :: Type -> Maybe Type
+-- Newtypes that are recursive are reprsented by TyConApp, just
+-- as they always were. Occasionally we want to find their representation type.
+-- NB: remember that in this module, non-recursive newtypes are transparent
+
+splitNewType_maybe ty
+ = case splitTyConApp_maybe ty of
+ Just (tc,tys) | isNewTyCon tc -> ASSERT( tys `lengthIs` tyConArity tc )
+ -- The assert should hold because repType should
+ -- only be applied to *types* (of kind *)
+ Just (newTypeRep tc tys)
+ other -> Nothing
+
+-- A local helper function (not exported)
+newTypeRep new_tycon tys = case newTyConRep new_tycon of
+ (tvs, rep_ty) -> substTyWith tvs tys rep_ty