-- Generate selector functions for data constructors with labelled fields
module FieldSelectors where import List(nub) import HsDeclStruct import HasBaseStruct(hsPApp,hsPVar,hsPWildCard,hsEVar,hsFunBind) import HsGuardsStruct(HsRhs(..)) import TiNames(localVal')
Haskell 98 Report, section 3.15.1 Field Selection
fieldSelectors noDef cds = map selector fields
where
conFields = nub [((src,c),[n|(ns,_)<-fs,n<-ns])|HsRecDecl src _ _ c fs<-cds]
fields = nub [(src,n)|((src,_),ns)<-conFields,n<-ns]
selector (src,field) =
hsFunBind src
[HsMatch src field [hsPApp c (map pat fs)]
(HsBody (hsEVar x)) noDef
|((src,c),fs)<-conFields,field `elem` fs]
where
x = localVal' "x" (Just src)
pat f = if f==field
then hsPVar x
else hsPWildCard