- keep_tc tc = let dcs = tyConDataCons tc
- in
- defTyCon tc tc >> zipWithM_ defDataCon dcs dcs
-
-
-vectTyConDecls :: [TyCon] -> VM [TyCon]
-vectTyConDecls tcs = fixV $ \tcs' ->
- do
- mapM_ (uncurry defTyCon) (lazy_zip tcs tcs')
- mapM vectTyConDecl tcs
- where
- lazy_zip [] _ = []
- lazy_zip (x:xs) ~(y:ys) = (x,y) : lazy_zip xs ys
-
-vectTyConDecl :: TyCon -> VM TyCon
-vectTyConDecl tc
- = do
- name' <- cloneName mkVectTyConOcc name
- rhs' <- vectAlgTyConRhs (algTyConRhs tc)
-
- liftDs $ buildAlgTyCon name'
- tyvars
- [] -- no stupid theta
- rhs'
- rec_flag -- FIXME: is this ok?
- False -- FIXME: no generics
- False -- not GADT syntax
- Nothing -- not a family instance
- where
- name = tyConName tc
- tyvars = tyConTyVars tc
- rec_flag = boolToRecFlag (isRecursiveTyCon tc)
-
-vectAlgTyConRhs :: AlgTyConRhs -> VM AlgTyConRhs
-vectAlgTyConRhs (DataTyCon { data_cons = data_cons
- , is_enum = is_enum
- })
- = do
- data_cons' <- mapM vectDataCon data_cons
- zipWithM_ defDataCon data_cons data_cons'
- return $ DataTyCon { data_cons = data_cons'
- , is_enum = is_enum
- }
-
-vectDataCon :: DataCon -> VM DataCon
-vectDataCon dc
- | not . null $ dataConExTyVars dc = pprPanic "vectDataCon: existentials" (ppr dc)
- | not . null $ dataConEqSpec dc = pprPanic "vectDataCon: eq spec" (ppr dc)
- | otherwise
- = do
- name' <- cloneName mkVectDataConOcc name
- tycon' <- vectTyCon tycon
- arg_tys <- mapM vectType rep_arg_tys
-
- liftDs $ buildDataCon name'
- False -- not infix
- (map (const NotMarkedStrict) arg_tys)
- [] -- no labelled fields
- univ_tvs
- [] -- no existential tvs for now
- [] -- no eq spec for now
- [] -- no context
- arg_tys
- tycon'
- where
- name = dataConName dc
- univ_tvs = dataConUnivTyVars dc
- rep_arg_tys = dataConRepArgTys dc
- tycon = dataConTyCon dc
-
-mk_fam_inst :: TyCon -> TyCon -> (TyCon, [Type])
-mk_fam_inst fam_tc arg_tc
- = (fam_tc, [mkTyConApp arg_tc . mkTyVarTys $ tyConTyVars arg_tc])
-
-buildPReprTyCon :: TyCon -> TyCon -> VM TyCon
-buildPReprTyCon orig_tc vect_tc
- = do
- name <- cloneName mkPReprTyConOcc (tyConName orig_tc)
- rhs_ty <- buildPReprType vect_tc
- prepr_tc <- builtin preprTyCon
- liftDs $ buildSynTyCon name
- tyvars
- (SynonymTyCon rhs_ty)
- (Just $ mk_fam_inst prepr_tc vect_tc)
- where
- tyvars = tyConTyVars vect_tc
-
-buildPReprType :: TyCon -> VM Type
-buildPReprType = liftM repr_type . mkTyConRepr
-
-buildToPRepr :: TyConRepr -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildToPRepr (TyConRepr {
- repr_tys = repr_tys
- , repr_prod_tycons = prod_tycons
- , repr_prod_tys = prod_tys
- , repr_sum_tycon = repr_sum_tycon
- , repr_type = repr_type
- })
- vect_tc prepr_tc _
- = do
- arg <- newLocalVar FSLIT("x") arg_ty
- vars <- mapM (mapM (newLocalVar FSLIT("x"))) repr_tys
-
- return . Lam arg
- . wrapFamInstBody prepr_tc var_tys
- . Case (Var arg) (mkWildId arg_ty) repr_type
- . mk_alts data_cons vars
- . zipWith3 mk_prod prod_tycons repr_tys $ map (map Var) vars
- where
- var_tys = mkTyVarTys $ tyConTyVars vect_tc
- arg_ty = mkTyConApp vect_tc var_tys
- data_cons = tyConDataCons vect_tc
-
- Just sum_tycon = repr_sum_tycon
- sum_data_cons = tyConDataCons sum_tycon
-
- mk_alts _ _ [] = [(DEFAULT, [], Var unitDataConId)]
- mk_alts [dc] [vars] [expr] = [(DataAlt dc, vars, expr)]
- mk_alts dcs vars exprs = zipWith4 mk_alt dcs vars sum_data_cons exprs
-
- mk_alt dc vars sum_dc expr = (DataAlt dc, vars,
- mkConApp sum_dc (map Type prod_tys ++ [expr]))
-
- mk_prod _ _ [] = Var unitDataConId
- mk_prod _ _ [expr] = expr
- mk_prod (Just tc) tys exprs = mkConApp dc (map Type tys ++ exprs)
- where
- [dc] = tyConDataCons tc
-
-buildFromPRepr :: TyConRepr -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildFromPRepr (TyConRepr {
- repr_tys = repr_tys
- , repr_prod_tycons = prod_tycons
- , repr_prod_tys = prod_tys
- , repr_sum_tycon = repr_sum_tycon
- , repr_type = repr_type
- })
- vect_tc prepr_tc _
- = do
- arg_ty <- mkPReprType res_ty
- arg <- newLocalVar FSLIT("x") arg_ty
-
- liftM (Lam arg
- . un_sum (unwrapFamInstScrut prepr_tc var_tys (Var arg)))
- (sequence $ zipWith4 un_prod data_cons prod_tycons prod_tys repr_tys)
- where
- var_tys = mkTyVarTys $ tyConTyVars vect_tc
- ty_args = map Type var_tys
- res_ty = mkTyConApp vect_tc var_tys
- data_cons = tyConDataCons vect_tc
-
- Just sum_tc = repr_sum_tycon
- sum_data_cons = tyConDataCons sum_tc
-
- un_prod dc _ _ []
- = do
- var <- newLocalVar FSLIT("u") unitTy
- return (var, mkConApp dc ty_args)
- un_prod dc _ _ [ty]
- = do
- var <- newLocalVar FSLIT("x") ty
- return (var, mkConApp dc (ty_args ++ [Var var]))
-
- un_prod dc (Just prod_tc) prod_ty tys
- = do
- vars <- mapM (newLocalVar FSLIT("x")) tys
- pv <- newLocalVar FSLIT("p") prod_ty
-
- let res = mkConApp dc (ty_args ++ map Var vars)
- expr = Case (Var pv) (mkWildId prod_ty) res_ty
- [(DataAlt prod_dc, vars, res)]
-
- return (pv, expr)
- where
- [prod_dc] = tyConDataCons prod_tc
-