- mk_alt dc = do
- bndrs <- mapM (newLocalVar FSLIT("x")) $ dataConRepArgTys dc
- return (bndrs, mkConApp dc (map Type var_tys ++ map Var bndrs))
+ 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
+
+
+ un_sum scrut [(var, expr)] = Let (NonRec var scrut) expr
+ un_sum scrut alts
+ = Case scrut (mkWildId repr_type) res_ty
+ $ zipWith mk_alt sum_data_cons alts
+
+ mk_alt sum_dc (var, expr) = (DataAlt sum_dc, [var], expr)
+