- = let
- data_con_RDR = qual_orig_name data_con
- data_con_str= occNameString (getOccName data_con)
- con_arity = argFieldCount data_con
- con_expr = mk_easy_App data_con_RDR as_needed
- nullary_con = con_arity == 0
- labels = dataConFieldLabels data_con
- lab_fields = length labels
-
- as_needed = take con_arity as_RDRs
- bs_needed
- | lab_fields == 0 = take con_arity bs_RDRs
- | otherwise = take (4*lab_fields + 1) bs_RDRs
- -- (label, '=' and field)*n, (n-1)*',' + '{' + '}'
- con_qual
- = BindStmt
- (TuplePatIn [LitPatIn (mkHsString data_con_str),
- d_Pat] True)
- (HsApp (HsVar lex_RDR) c_Expr)
- tycon_loc
-
- str_qual str res draw_from
- = BindStmt
- (TuplePatIn [LitPatIn (mkHsString str), VarPatIn res] True)
- (HsApp (HsVar lex_RDR) draw_from)
- tycon_loc
+ = HsApp (
+ readParen_Expr read_paren_arg $ HsPar $
+ HsLam (mk_easy_Match tycon_loc [c_Pat] [] $
+ HsDo ListComp stmts tycon_loc)
+ ) (HsVar b_RDR)
+ where
+ data_con_RDR = qual_orig_name data_con
+ data_con_str = occNameUserString (getOccName data_con)
+ con_arity = dataConSourceArity data_con
+ con_expr = mk_easy_App data_con_RDR as_needed
+ nullary_con = con_arity == 0
+ labels = dataConFieldLabels data_con
+ lab_fields = length labels
+ dc_nm = getName data_con
+ is_infix = isDataSymOcc (getOccName dc_nm)
+
+ as_needed = take con_arity as_RDRs
+ bs_needed
+ | is_infix = take (1 + con_arity) bs_RDRs
+ | lab_fields == 0 = take con_arity bs_RDRs
+ | otherwise = take (4*lab_fields + 1) bs_RDRs
+ -- (label, '=' and field)*n, (n-1)*',' + '{' + '}'
+
+ (as1:as2:_) = as_needed
+ (bs1:bs2:bs3:_) = bs_needed
+
+ con_qual
+ | not is_infix =
+ BindStmt
+ (TuplePatIn [LitPatIn (mkHsString data_con_str), d_Pat] Boxed)
+ (HsApp (HsVar lex_RDR) c_Expr)
+ tycon_loc
+ | otherwise =
+ BindStmt
+ (TuplePatIn [LitPatIn (mkHsString data_con_str), VarPatIn bs2] Boxed)
+ (HsApp (HsVar lex_RDR) (HsVar bs1))
+ tycon_loc
+
+
+ str_qual str res draw_from =
+ BindStmt
+ (TuplePatIn [LitPatIn (mkHsString str), VarPatIn res] Boxed)
+ (HsApp (HsVar lex_RDR) draw_from)
+ tycon_loc
+
+ str_qual_paren str res draw_from =
+ BindStmt
+ (TuplePatIn [LitPatIn (mkHsString str), VarPatIn res] Boxed)
+ (HsApp (readParen_Expr true_Expr (HsVar lex_RDR)) draw_from)
+ tycon_loc