Generate a little bit less code for record selectors.
import FieldLabel ( FieldLabel )
import PrelVals ( pAT_ERROR_ID )
import Maybes
import FieldLabel ( FieldLabel )
import PrelVals ( pAT_ERROR_ID )
import Maybes
import Outputable
import Util ( assoc )
\end{code}
import Outputable
import Util ( assoc )
\end{code}
tyvar_tys = mkTyVarTys tyvars
[data_id] = mkTemplateLocals [data_ty]
tyvar_tys = mkTyVarTys tyvars
[data_id] = mkTemplateLocals [data_ty]
- sel_rhs = mkTyLam tyvars $
- mkValLam [data_id] $
- Case (Var data_id) (AlgAlts (catMaybes (map mk_maybe_alt data_cons))
- (BindDefault data_id error_expr))
+ alts = map mk_maybe_alt data_cons
+ sel_rhs = mkTyLam tyvars $
+ mkValLam [data_id] $
+ Case (Var data_id)
+ -- if any of the constructors don't have the label, ...
+ (if any (not . isJust) alts then
+ AlgAlts (catMaybes alts)
+ (BindDefault data_id error_expr)
+ else
+ AlgAlts (catMaybes alts) NoDefault)
+
mk_maybe_alt data_con
= case maybe_the_arg_id of
Nothing -> Nothing
mk_maybe_alt data_con
= case maybe_the_arg_id of
Nothing -> Nothing