- ------------ gunfold
- gunfold_bind = mk_FunMonoBind tycon_loc gunfold_RDR (map gunfold_eqn data_cons ++ [catch_all])
- gunfold_eqn con = ([VarPat k_RDR, VarPat z_RDR, wildPat,
- ConPatIn constr_RDR (PrefixCon [LitPat (mk_constr_string con)])],
- apN (dataConSourceArity con)
- (\e -> HsVar k_RDR `HsApp` e)
- (z_Expr `HsApp` HsVar (getRdrName con)))
- catch_all = ([wildPat, wildPat, VarPat e_RDR, wildPat], HsVar e_RDR)
- mk_constr_string con = mkHsString (occNameUserString (getOccName con))
-
- ------------ conOf
- conOf_bind = mk_FunMonoBind tycon_loc conOf_RDR (map conOf_eqn data_cons)
- conOf_eqn con = ([mkWildConPat con], mk_constr con)
-
- ------------ consOf
- consOf_bind = mk_easy_FunMonoBind tycon_loc consOf_RDR [wildPat] []
- (ExplicitList placeHolderType (map mk_constr data_cons))
- mk_constr con = HsVar constr_RDR `HsApp` (HsLit (mk_constr_string con))
-
-
-apN :: Int -> (a -> a) -> a -> a
-apN 0 k z = z
-apN n k z = apN (n-1) k (k z)
+ ------------ fromConstr
+ fromCon_bind = mk_FunMonoBind tycon_loc fromConstr_RDR [([c_Pat], from_con_rhs)]
+ from_con_rhs = HsCase (HsVar conIndex_RDR `HsApp` c_Expr)
+ (map from_con_alt data_cons) tycon_loc
+ from_con_alt dc = mkSimpleHsAlt (ConPatIn intDataCon_RDR (PrefixCon [LitPat (HsIntPrim (toInteger (dataConTag dc)))]))
+ (mkHsVarApps (getRdrName dc)
+ (replicate (dataConSourceArity dc) undefined_RDR))
+
+ ------------ toConstr
+ toCon_bind = mk_FunMonoBind tycon_loc toConstr_RDR (map to_con_eqn data_cons)
+ to_con_eqn dc = ([mkWildConPat dc], HsVar (mk_constr_name dc))
+
+ ------------ dataTypeOf
+ dataTypeOf_bind = mk_easy_FunMonoBind tycon_loc dataTypeOf_RDR [wildPat]
+ [] (HsVar data_type_name)
+
+ ------------ $dT
+ data_type_name = mkDerivedRdrName tycon_name mkDataTOcc
+ datatype_bind = mkVarMonoBind tycon_loc data_type_name
+ (HsVar mkDataType_RDR `HsApp`
+ ExplicitList placeHolderType constrs)
+ constrs = [HsVar (mk_constr_name con) | con <- data_cons]
+
+
+ ------------ $cT1 etc
+ mk_constr_name con = mkDerivedRdrName (dataConName con) mkDataCOcc
+ mk_con_bind dc = mkVarMonoBind tycon_loc (mk_constr_name dc)
+ (mkHsApps mkConstr_RDR (constr_args dc))
+ constr_args dc = [mkHsIntLit (toInteger (dataConTag dc)), -- Tag
+ HsLit (mkHsString (occNameUserString dc_occ)), -- String name
+ HsVar fixity] -- Fixity
+ where
+ dc_occ = getOccName dc
+ is_infix = isDataSymOcc dc_occ
+ fixity | is_infix = infix_RDR
+ | otherwise = prefix_RDR
+
+gfoldl_RDR = varQual_RDR gENERICS_Name FSLIT("gfoldl")
+fromConstr_RDR = varQual_RDR gENERICS_Name FSLIT("fromConstr")
+toConstr_RDR = varQual_RDR gENERICS_Name FSLIT("toConstr")
+dataTypeOf_RDR = varQual_RDR gENERICS_Name FSLIT("dataTypeOf")
+mkConstr_RDR = varQual_RDR gENERICS_Name FSLIT("mkConstr")
+mkDataType_RDR = varQual_RDR gENERICS_Name FSLIT("mkDataType")
+conIndex_RDR = varQual_RDR gENERICS_Name FSLIT("conIndex")
+prefix_RDR = dataQual_RDR gENERICS_Name FSLIT("Prefix")
+infix_RDR = dataQual_RDR gENERICS_Name FSLIT("Infix")