@@ -133,12 +133,14 @@ import Data.THGen.Enum
133133import qualified Data.Text as T
134134import GHC.Generics (Generic)
135135import qualified Language.Haskell.TH as TH
136+import qualified Language.Haskell.TH.Syntax as TH
136137import Prelude hiding ((+), (*))
137138import qualified Text.XML as X
138139import Text.XML.DOM.Parser
139140import Text.XML.ParentAttributes
140141import qualified Text.XML.Writer as XW
141142
143+
142144data XmlFieldPlural
143145 = XmlFieldPluralMandatory -- Occurs exactly 1 time (Identity)
144146 | XmlFieldPluralOptional -- Occurs 0 or 1 times (Maybe)
@@ -231,7 +233,7 @@ infix 0 =:=
231233instance Description PrefixName IsoXmlDescRecord where
232234 prefixName =:= descRecord =
233235 let descRecordParts = descRecord ^. _IsoXmlDescRecord
234− in isoXmlGenerateRecord prefixName (reverse descRecordParts)
236+ in isoXmlGenerateDatatype prefixName (reverse descRecordParts)
235237
236238record :: IsoXmlDescRecord
237239record = IsoXmlDescRecord []
@@ -310,14 +312,15 @@ isoXmlGenerateEnum (ExhaustivenessName strName' exh) enumCons = do
310312 return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
311313 fromDomInst, fromAttributeInst]
312314
313−isoXmlGenerateRecord :: PrefixName -> [IsoXmlDescRecordPart] -> TH.DecsQ
314−isoXmlGenerateRecord (PrefixName strName' strPrefix') descRecordParts = do
315+isoXmlGenerateDatatype :: PrefixName -> [IsoXmlDescRecordPart] -> TH.DecsQ
316+isoXmlGenerateDatatype (PrefixName strName' strPrefix') descRecordParts = do
315317 let
318+ isNewtype = length descRecordParts == 1
316319 strName = "Xml" ++ strName'
317320 strPrefix = "x" ++ strPrefix'
318321 name = TH.mkName strName
319322 fieldName str = "_" ++ strPrefix ++ over _head C.toUpper str
320− dataDecl <- do
323+ termDecl <- do
321324 let
322325 fields = do
323326 descRecordPart <- descRecordParts
@@ -331,8 +334,9 @@ isoXmlGenerateRecord (PrefixName strName' strPrefix') descRecordParts = do
331334 XmlFieldPluralOptional -> [t| Maybe $fieldType |]
332335 XmlFieldPluralRepeated -> [t| [$fieldType] |]
333336 XmlFieldPluralMultiplied -> [t| NonEmpty $fieldType |]
334− in
335− varStrictType fName (strictType fType)
337+ in if isNewtype
338+ then varStrictType fName (nonStrictType fType)
339+ else varStrictType fName (strictType fType)
336340 IsoXmlDescRecordAttribute descAttribute ->
337341 let
338342 IsoXmlDescAttribute
@@ -343,11 +347,11 @@ isoXmlGenerateRecord (PrefixName strName' strPrefix') descRecordParts = do
343347 XmlAttributePluralOptional -> [t| Maybe $attributeType |]
344348 in
345349 varStrictType fName (strictType fType)
346− dataD
347− name
348− [TH.recC name fields]
349− [''Eq, ''Show, ''Generic]
350− lensDecls <- makeFieldOpticsForDec lensRules dataDecl
350+ if isNewtype
351+ -- generate a newtype instead to do less allocations later
352+ then newtypeD name (TH.recC name fields) [''Eq, ''Show, ''Generic]
353+ else dataD name [TH.recC name fields] [''Eq, ''Show, ''Generic]
354+ lensDecls <- makeFieldOpticsForDec lensRules termDecl
351355 nfDataInst <- do
352356 TH.instanceD
353357 (return [])
@@ -439,8 +443,8 @@ isoXmlGenerateRecord (PrefixName strName' strPrefix') descRecordParts = do
439443 [t|ToXmlParentAttributes $(TH.conT name)|]
440444 [funSimple 'toXmlParentAttributes toXmlParentAttributesExpr]
441445
442− return $ [dataDecl] ++ lensDecls ++
443− [fromDomInst, toXmlInst, toXmlParentAttributesInst]
446+ return $ [termDecl] ++ lensDecls ++
447+ [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]
444448
445449distribPair :: Functor f => (a, f b) -> f (a, b)
446450distribPair (a, fb) = (a,) <$> fb