@@ -1,11 +1,10 @@
1−{-# LANGUAGE CPP #-}
21{-# LANGUAGE UndecidableInstances #-}
32{-# LANGUAGE FunctionalDependencies #-}
43
54module Data.THGen.XML.Internal where
65
76import Control.DeepSeq
8−import Control.Lens hiding (repeated, enum, (&), Strict)
7+import Control.Lens hiding (repeated, enum, (&))
98import Control.Lens.Internal.FieldTH (makeFieldOpticsForDec)
109import qualified Data.Char as C
1110import Data.List.NonEmpty (NonEmpty)
@@ -15,7 +14,7 @@ import Data.THGen.Compat as THC
1514import Data.THGen.Enum
1615import qualified Data.Text as T
1716import GHC.Generics (Generic)
18−import Language.Haskell.TH as TH hiding (Strict)
17+import Language.Haskell.TH as TH
1918import Prelude hiding ((+), (*), (^))
2019import qualified Text.XML as X
2120import Text.XML.DOM.Parser hiding (parseContent)
@@ -23,22 +22,6 @@ import Text.XML.DOM.Parser.Internal.Content
2322import Text.XML.ParentAttributes
2423import qualified Text.XML.Writer as XW
2524
26−data ParserMode
27− = Strict
28− | Lenient
29−
30−data GenType
31− = Parser
32− | Generator
33− | ParserAndGenerator
34− | LenientParser
35− | LenientParserAndGenerator
36−
37−isLenientType :: GenType -> Bool
38−isLenientType = \case
39− LenientParser -> True
40− LenientParserAndGenerator -> True
41− _ -> False
4225
4326data XmlFieldPlural
4427 = XmlFieldPluralMandatory -- Occurs exactly 1 time (Identity)
@@ -69,7 +52,7 @@ data IsoXmlDescRecordPart
6952 | IsoXmlDescRecordAttribute IsoXmlDescAttribute
7053 | IsoXmlDescRecordContent IsoXmlDescContent
7154
72−data IsoXmlDescRecord = IsoXmlDescRecord GenType [IsoXmlDescRecordPart]
55+newtype IsoXmlDescRecord = IsoXmlDescRecord [IsoXmlDescRecordPart]
7356
7457makePrisms ''IsoXmlDescRecord
7558
@@ -81,7 +64,7 @@ newtype IsoXmlDescEnumCon
8164instance IsString IsoXmlDescEnumCon where
8265 fromString = IsoXmlDescEnumCon
8366
84−data IsoXmlDescEnum = IsoXmlDescEnum GenType [IsoXmlDescEnumCon]
67+data IsoXmlDescEnum = IsoXmlDescEnum [IsoXmlDescEnumCon]
8568
8669makePrisms ''IsoXmlDescEnum
8770
@@ -90,26 +73,26 @@ appendField
9073 -> IsoXmlDescRecord
9174 -> IsoXmlDescPreField
9275 -> IsoXmlDescRecord
93−appendField plural (IsoXmlDescRecord genType fields) (IsoXmlDescPreField name ty) =
76+appendField plural xrec (IsoXmlDescPreField name ty) =
9477 let xfield = IsoXmlDescRecordField $ IsoXmlDescField plural name ty
95− in IsoXmlDescRecord genType (xfield:fields)
78+ in over _IsoXmlDescRecord (xfield:) xrec
9679
9780appendAttribute
9881 :: XmlAttributePlural
9982 -> IsoXmlDescRecord
10083 -> IsoXmlDescPreAttribute
10184 -> IsoXmlDescRecord
102−appendAttribute plural (IsoXmlDescRecord genType fields) (IsoXmlDescPreAttribute name ty) =
85+appendAttribute plural xrec (IsoXmlDescPreAttribute name ty) =
10386 let xattribute = IsoXmlDescRecordAttribute $ IsoXmlDescAttribute plural name ty
104− in IsoXmlDescRecord genType (xattribute:fields)
87+ in over _IsoXmlDescRecord (xattribute:) xrec
10588
10689appendContent
10790 :: IsoXmlDescRecord
10891 -> IsoXmlDescPreContent
10992 -> IsoXmlDescRecord
110−appendContent (IsoXmlDescRecord genType fields) (IsoXmlDescPreContent name ty) =
93+appendContent xrec (IsoXmlDescPreContent name ty) =
11194 let xcontent = IsoXmlDescRecordContent $ IsoXmlDescContent name ty
112− in IsoXmlDescRecord genType (xcontent:fields)
95+ in over _IsoXmlDescRecord (xcontent:) xrec
11396
11497(!), (?), (*), (+) :: IsoXmlDescRecord -> IsoXmlDescPreField -> IsoXmlDescRecord
11598(!) = appendField XmlFieldPluralMandatory
@@ -133,8 +116,8 @@ infixl 2 ?%
133116infixl 2 ^
134117
135118appendEnumCon :: IsoXmlDescEnum -> IsoXmlDescEnumCon -> IsoXmlDescEnum
136−appendEnumCon (IsoXmlDescEnum genType enumCons) xenumcon =
137− IsoXmlDescEnum genType (xenumcon:enumCons)
119+appendEnumCon xenum xenumcon =
120+ over _IsoXmlDescEnum (xenumcon:) xenum
138121
139122(&) :: IsoXmlDescEnum -> IsoXmlDescEnumCon -> IsoXmlDescEnum
140123(&) = appendEnumCon
@@ -147,20 +130,22 @@ class Description name desc | desc -> name where
147130infix 0 =:=
148131
149132instance Description PrefixName IsoXmlDescRecord where
150− prefixName =:= (IsoXmlDescRecord genType descRecordParts) =
151− isoXmlGenerateDatatype genType prefixName (reverse descRecordParts)
133+ prefixName =:= descRecord =
134+ let descRecordParts = descRecord ^. _IsoXmlDescRecord
135+ in isoXmlGenerateDatatype prefixName (reverse descRecordParts)
152136
153−record :: GenType -> IsoXmlDescRecord
154−record gt = IsoXmlDescRecord gt []
137+record :: IsoXmlDescRecord
138+record = IsoXmlDescRecord []
155139
156−enum :: GenType -> IsoXmlDescEnum
157−enum gt = IsoXmlDescEnum gt []
140+enum :: IsoXmlDescEnum
141+enum = IsoXmlDescEnum []
158142
159143instance Description ExhaustivenessName IsoXmlDescEnum where
160− exhaustivenessName =:= (IsoXmlDescEnum genType descEnumCons) =
161− isoXmlGenerateEnum genType exhaustivenessName (reverse descEnumCons)
144+ exhaustivenessName =:= descEnum =
145+ let descEnumCons = descEnum ^. _IsoXmlDescEnum
146+ in isoXmlGenerateEnum exhaustivenessName (reverse descEnumCons)
162147
163−instance (m ~ Q) => IsString (m TH.Type -> IsoXmlDescPreField) where
148+instance IsString (TH.TypeQ -> IsoXmlDescPreField) where
164149 fromString = IsoXmlDescPreField
165150
166151instance IsString IsoXmlDescPreField where
@@ -168,10 +153,10 @@ instance IsString IsoXmlDescPreField where
168153 where
169154 ty = (TH.conT . TH.mkName) ("Xml" ++ over _head C.toUpper (xmlLocalName name))
170155
171−instance (m ~ Q) => IsString (m TH.Type -> IsoXmlDescPreAttribute) where
156+instance IsString (TH.TypeQ -> IsoXmlDescPreAttribute) where
172157 fromString = IsoXmlDescPreAttribute
173158
174−instance (m ~ Q) => IsString (m Type -> IsoXmlDescPreContent) where
159+instance IsString (TH.TypeQ -> IsoXmlDescPreContent) where
175160 fromString = IsoXmlDescPreContent
176161
177162instance IsString IsoXmlDescPreAttribute where
@@ -197,77 +182,45 @@ instance IsString ExhaustivenessName where
197182 fromString strName = ExhaustivenessName strName NonExhaustive
198183
199184makeNamePrefix :: String -> String
200−makeNamePrefix = map C.toLower . filter (\c -> C.isUpper c || C.isDigit c)
185+makeNamePrefix = map C.toLower . filter C.isUpper
201186
202187funSimple :: TH.Name -> TH.ExpQ -> TH.DecQ
203188funSimple name body = TH.funD name [ TH.clause [] (TH.normalB body) [] ]
204189
205190isoXmlGenerateEnum
206− :: GenType
207− -> ExhaustivenessName
208− -> [IsoXmlDescEnumCon]
209− -> TH.DecsQ
210−isoXmlGenerateEnum genType (ExhaustivenessName strName' exh) enumCons = do
191+ :: ExhaustivenessName -> [IsoXmlDescEnumCon] -> TH.DecsQ
192+isoXmlGenerateEnum (ExhaustivenessName strName' exh) enumCons = do
211193 let
212194 strName = "Xml" ++ strName'
213195 strVals = map unIsoXmlDescEnumCon enumCons
214196 enumDesc = EnumDesc exh strName strVals
215197 name = TH.mkName strName
216198 enumDecls <- enumGenerate enumDesc
217− let
218− genToXmlInst = do
219− TH.instanceD
220− (return [])
221− [t|XW.ToXML $(TH.conT name)|]
222− [funSimple 'XW.toXML [e|XW.toXML . T.pack . show|]]
223− genToXmlAttributeInst = do
224− TH.instanceD
225− (return [])
226− [t|ToXmlAttribute $(TH.conT name)|]
227− [funSimple 'toXmlAttribute [e|T.pack . show|]]
228− genFromDomInst mode = do
229− TH.instanceD
230− (return [])
231− [t|FromDom $(TH.conT name)|]
232− [case mode of
233− Strict -> funSimple 'fromDom [e|parseContent readContent|]
234− Lenient -> funSimple 'fromDom [e|ignoreBlank $ parseContent readContent|]
235− ]
236− genFromAttributeInst = do
237− TH.instanceD
238− (return [])
239− [t|FromAttribute $(TH.conT name)|]
240− [funSimple 'fromAttribute [e|readContent|]]
241− case genType of
242− Generator -> do
243− toXmlInst <- genToXmlInst
244− toXmlAttributeInst <- genToXmlAttributeInst
245− return $ enumDecls ++ [toXmlInst, toXmlAttributeInst]
246− Parser -> do
247− fromDomInst <- genFromDomInst Strict
248− fromAttributeInst <- genFromAttributeInst
249− return $ enumDecls ++ [fromDomInst, fromAttributeInst]
250− LenientParser -> do
251− fromDomInst <- genFromDomInst Lenient
252− fromAttributeInst <- genFromAttributeInst
253− return $ enumDecls ++ [fromDomInst, fromAttributeInst]
254− ParserAndGenerator -> do
255− toXmlInst <- genToXmlInst
256− toXmlAttributeInst <- genToXmlAttributeInst
257− fromDomInst <- genFromDomInst Strict
258− fromAttributeInst <- genFromAttributeInst
259− return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
260− fromDomInst, fromAttributeInst]
261− LenientParserAndGenerator -> do
262− toXmlInst <- genToXmlInst
263− toXmlAttributeInst <- genToXmlAttributeInst
264− fromDomInst <- genFromDomInst Lenient
265− fromAttributeInst <- genFromAttributeInst
266− return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
267− fromDomInst, fromAttributeInst]
268−
269−isoXmlGenerateDatatype :: GenType -> PrefixName -> [IsoXmlDescRecordPart] -> TH.DecsQ
270−isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts = do
199+ toXmlInst <- do
200+ TH.instanceD
201+ (return [])
202+ [t|XW.ToXML $(TH.conT name)|]
203+ [funSimple 'XW.toXML [e|XW.toXML . T.pack . show|]]
204+ toXmlAttributeInst <- do
205+ TH.instanceD
206+ (return [])
207+ [t|ToXmlAttribute $(TH.conT name)|]
208+ [funSimple 'toXmlAttribute [e|T.pack . show|]]
209+ fromDomInst <- do
210+ TH.instanceD
211+ (return [])
212+ [t|FromDom $(TH.conT name)|]
213+ [funSimple 'fromDom [e|parseContent readContent|]]
214+ fromAttributeInst <- do
215+ TH.instanceD
216+ (return [])
217+ [t|FromAttribute $(TH.conT name)|]
218+ [funSimple 'fromAttribute [e|readContent|]]
219+ return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
220+ fromDomInst, fromAttributeInst]
221+
222+isoXmlGenerateDatatype :: PrefixName -> [IsoXmlDescRecordPart] -> TH.DecsQ
223+isoXmlGenerateDatatype (PrefixName strName' strPrefix') descRecordParts = do
271224 let
272225 isNewtype = length descRecordParts == 1
273226 strName = "Xml" ++ strName'
@@ -284,14 +237,11 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
284237 IsoXmlDescField fieldPlural rawName fieldType = descField
285238 fieldStrName = xmlLocalName rawName
286239 fName = TH.mkName (fieldName fieldStrName)
287− fType' = case fieldPlural of
240+ fType = case fieldPlural of
288241 XmlFieldPluralMandatory -> fieldType
289242 XmlFieldPluralOptional -> [t| Maybe $fieldType |]
290243 XmlFieldPluralRepeated -> [t| [$fieldType] |]
291244 XmlFieldPluralMultiplied -> [t| NonEmpty $fieldType |]
292− fType = if isLenientType genType
293− then [t| Maybe $fType' |]
294− else fType'
295245 in if isNewtype
296246 then THC.varStrictType fName (THC.nonStrictType fType)
297247 else THC.varStrictType fName (THC.strictType fType)
@@ -324,127 +274,103 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
324274 (return [])
325275 [t|NFData $(TH.conT name)|]
326276 [ ]
277+ fromDomInst <- do
278+ let
279+ exprHeader = [e|pure $(TH.conE name)|]
280+ exprRecordParts = do
281+ descRecordPart <- descRecordParts
282+ return $ case descRecordPart of
283+ IsoXmlDescRecordField descField ->
284+ let
285+ IsoXmlDescField fieldPlural rawName _ = descField
286+ fieldStrName = xmlLocalName rawName
287+ exprFieldStrName = TH.litE (TH.stringL fieldStrName)
288+ fieldParse = case fieldPlural of
289+ XmlFieldPluralMandatory -> [e|inElem|]
290+ _ -> [e|inElemTrav|]
291+ in
292+ [e|$fieldParse $exprFieldStrName fromDom|]
293+ IsoXmlDescRecordAttribute descAttribute ->
294+ let
295+ IsoXmlDescAttribute attributePlural attributeStrName _ = descAttribute
296+ exprAttributeStrName = TH.litE (TH.stringL attributeStrName)
297+ attributeParse = case attributePlural of
298+ XmlAttributePluralMandatory -> [e|parseAttribute|]
299+ XmlAttributePluralOptional -> [e|parseAttributeMaybe|]
300+ in
301+ [e|$attributeParse $exprAttributeStrName fromAttribute|]
302+ IsoXmlDescRecordContent _ -> [e|parseContent fromAttribute|]
303+ fromDomExpr = foldl (\e fe -> [e| $e <*> $fe |]) exprHeader exprRecordParts
304+ TH.instanceD
305+ (return [])
306+ [t|FromDom $(TH.conT name)|]
307+ [ funSimple 'fromDom fromDomExpr ]
327308
328− let
329− genFromDomInst mode = do
330− let
331− exprHeader = [e|pure $(TH.conE name)|]
332− exprRecordParts = do
333− descRecordPart <- descRecordParts
334− return $ case descRecordPart of
335− IsoXmlDescRecordField descField ->
336− let
337− IsoXmlDescField fieldPlural rawName _ = descField
338− fieldStrName = xmlLocalName rawName
339− exprFieldStrName = TH.litE (TH.stringL fieldStrName)
340− fieldParse = case fieldPlural of
341− XmlFieldPluralMandatory -> [e|inElem|]
342− _ -> [e|inElemTrav|]
343− in case mode of
344− Strict -> [e|$fieldParse $exprFieldStrName fromDom|]
345− Lenient -> [e|$fieldParse $exprFieldStrName (ignoreBlank fromDom)|]
346− IsoXmlDescRecordAttribute descAttribute ->
347− let
348− IsoXmlDescAttribute attributePlural attributeStrName _ = descAttribute
349− exprAttributeStrName = TH.litE (TH.stringL attributeStrName)
350− attributeParse = case attributePlural of
351− XmlAttributePluralMandatory -> [e|parseAttribute|]
352− XmlAttributePluralOptional -> [e|parseAttributeMaybe|]
353− in
354− [e|$attributeParse $exprAttributeStrName fromAttribute|]
355− IsoXmlDescRecordContent _ -> [e|parseContent fromAttribute|]
356− fromDomExpr = foldl (\e fe -> [e| $e <*> $fe |]) exprHeader exprRecordParts
357− TH.instanceD
358− (return [])
359− [t|FromDom $(TH.conT name)|]
360− [ funSimple 'fromDom fromDomExpr ]
361−
362− genToXmlInst = do
363− objName <- TH.newName strPrefix
364− let
365− exprFields = do
366− descRecordPart <- descRecordParts
367− case descRecordPart of
368− IsoXmlDescRecordField (IsoXmlDescField fieldPlural rawName _) -> do
369− let
370− fieldStrName = xmlLocalName rawName
371− fName = TH.mkName (fieldName fieldStrName)
372− exprFieldStrName = TH.litE (TH.stringL rawName)
373− exprForField = case fieldPlural of
374− XmlFieldPluralMandatory -> [e|id|]
375− _ -> [e|traverse|]
376− exprFieldValue = [e|$(TH.varE fName) $(TH.varE objName)|]
377− exprFieldRender =
378− [e|(\a ->
379− XW.elementA $exprFieldStrName (toXmlParentAttributes a) a)|]
380− return [e|$exprForField $exprFieldRender $exprFieldValue|]
381− IsoXmlDescRecordContent (IsoXmlDescContent rawName _) -> do
382− let
383− fieldStrName = xmlLocalName rawName
384− fName = TH.mkName (fieldName fieldStrName)
385− exprFieldValue = [e|$(TH.varE fName) $(TH.varE objName)|]
386− return [e|XW.content . toXmlAttribute $ $exprFieldValue|]
387− _ -> []
388− toXmlExpr
389− = TH.lamE [if null exprFields then TH.wildP else TH.varP objName]
390− $ foldr (\fe e -> [e|$fe *> $e|]) [e|return ()|] exprFields
391− TH.instanceD
392− (return [])
393− [t|XW.ToXML $(TH.conT name)|]
394− [funSimple 'XW.toXML toXmlExpr]
395− genToXmlParentAttributeInst = do
396− objName <- TH.newName strPrefix
397− let
398− exprAttributes = do
399− descRecordPart <- descRecordParts
400− IsoXmlDescAttribute attributePlural attributeStrName _ <-
401− maybeToList $ case descRecordPart of
402− IsoXmlDescRecordAttribute descAttribute -> Just descAttribute
403− _ -> Nothing
404− let
405− fName = TH.mkName (fieldName attributeStrName)
406− exprAttrStrName = TH.litE (TH.stringL attributeStrName)
407− exprAttrValue = [e|$(TH.varE fName) $(TH.varE objName)|]
408− exprAttrWrap = case attributePlural of
409− XmlAttributePluralMandatory -> [e|Just . toXmlAttribute|]
410− XmlAttributePluralOptional -> [e|fmap toXmlAttribute|]
411− return [e|($exprAttrStrName, $exprAttrWrap $exprAttrValue)|]
412− toXmlParentAttributesExpr
413− = TH.lamE [if null exprAttributes then TH.wildP else TH.varP objName]
414− $ [e|mapMaybe distribPair $(TH.listE exprAttributes)|]
309+ toXmlInst <- do
310+ objName <- TH.newName strPrefix
311+ let
312+ exprFields = do
313+ descRecordPart <- descRecordParts
314+ case descRecordPart of
315+ IsoXmlDescRecordField (IsoXmlDescField fieldPlural rawName _) -> do
316+ let
317+ fieldStrName = xmlLocalName rawName
318+ fName = TH.mkName (fieldName fieldStrName)
319+ exprFieldStrName = TH.litE (TH.stringL rawName)
320+ exprForField = case fieldPlural of
321+ XmlFieldPluralMandatory -> [e|id|]
322+ _ -> [e|traverse|]
323+ exprFieldValue = [e|$(TH.varE fName) $(TH.varE objName)|]
324+ exprFieldRender =
325+ [e|(\a ->
326+ XW.elementA $exprFieldStrName (toXmlParentAttributes a) a)|]
327+ return [e|$exprForField $exprFieldRender $exprFieldValue|]
328+ IsoXmlDescRecordContent (IsoXmlDescContent rawName _) -> do
329+ let
330+ fieldStrName = xmlLocalName rawName
331+ fName = TH.mkName (fieldName fieldStrName)
332+ exprFieldValue = [e|$(TH.varE fName) $(TH.varE objName)|]
333+ return [e|XW.content . toXmlAttribute $ $exprFieldValue|]
334+ _ -> []
335+ toXmlExpr
336+ = TH.lamE [if null exprFields then TH.wildP else TH.varP objName]
337+ $ foldr (\fe e -> [e|$fe *> $e|]) [e|return ()|] exprFields
338+ TH.instanceD
339+ (return [])
340+ [t|XW.ToXML $(TH.conT name)|]
341+ [funSimple 'XW.toXML toXmlExpr]
342+
343+ toXmlParentAttributesInst <- do
344+ objName <- TH.newName strPrefix
345+ let
346+ exprAttributes = do
347+ descRecordPart <- descRecordParts
348+ IsoXmlDescAttribute attributePlural attributeStrName _ <-
349+ maybeToList $ case descRecordPart of
350+ IsoXmlDescRecordAttribute descAttribute -> Just descAttribute
351+ _ -> Nothing
352+ let
353+ fName = TH.mkName (fieldName attributeStrName)
354+ exprAttrStrName = TH.litE (TH.stringL attributeStrName)
355+ exprAttrValue = [e|$(TH.varE fName) $(TH.varE objName)|]
356+ exprAttrWrap = case attributePlural of
357+ XmlAttributePluralMandatory -> [e|Just . toXmlAttribute|]
358+ XmlAttributePluralOptional -> [e|fmap toXmlAttribute|]
359+ return [e|($exprAttrStrName, $exprAttrWrap $exprAttrValue)|]
360+ toXmlParentAttributesExpr
361+ = TH.lamE [if null exprAttributes then TH.wildP else TH.varP objName]
362+ $ [e|mapMaybe distribPair $(TH.listE exprAttributes)|]
415363#if __GLASGOW_HASKELL__ < 800
416− TH.instanceD
364+ TH.instanceD
417365#else
418− TH.instanceWithOverlapD (Just TH.Overlapping)
366+ TH.instanceWithOverlapD (Just TH.Overlapping)
419367#endif
420− (return [])
421− [t|ToXmlParentAttributes $(TH.conT name)|]
422− [funSimple 'toXmlParentAttributes toXmlParentAttributesExpr]
423−
424− case genType of
425− Generator -> do
426− toXmlInst <- genToXmlInst
427− toXmlParentAttributesInst <- genToXmlParentAttributeInst
428− return $ [termDecl] ++ lensDecls ++
429− [toXmlInst, toXmlParentAttributesInst, nfDataInst]
430− Parser -> do
431− fromDomInst <- genFromDomInst Strict
432− return $ [termDecl] ++ lensDecls ++ [fromDomInst, nfDataInst]
433− LenientParser -> do
434− fromDomInst <- genFromDomInst Lenient
435− return $ [termDecl] ++ lensDecls ++ [fromDomInst, nfDataInst]
436− ParserAndGenerator -> do
437− toXmlInst <- genToXmlInst
438− toXmlParentAttributesInst <- genToXmlParentAttributeInst
439− fromDomInst <- genFromDomInst Strict
440− return $ [termDecl] ++ lensDecls ++
441− [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]
442− LenientParserAndGenerator -> do
443− toXmlInst <- genToXmlInst
444− toXmlParentAttributesInst <- genToXmlParentAttributeInst
445− fromDomInst <- genFromDomInst Lenient
446− return $ [termDecl] ++ lensDecls ++
447− [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]
368+ (return [])
369+ [t|ToXmlParentAttributes $(TH.conT name)|]
370+ [funSimple 'toXmlParentAttributes toXmlParentAttributesExpr]
371+
372+ return $ [termDecl] ++ lensDecls ++
373+ [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]
448374
449375distribPair :: Functor f => (a, f b) -> f (a, b)
450376distribPair (a, fb) = (a,) <$> fb