+instance Mergeable NmcDom where
+ merge sub dom = dom { domService = mergelm domService
+ , domIp = mergelm domIp
+ , domIp6 = mergelm domIp6
+ , domTor = choose domTor
+ , domI2p = mergelm domI2p
+ , domFreenet = choose domFreenet
+ , domAlias = choose domAlias
+ , domTranslate = choose domTranslate
+ , domEmail = choose domEmail
+ , domLoc = choose domLoc
+ , domInfo = mergelm domInfo
+ , domNs = mergelm domNs
+ , domDelegate = mergelm domDelegate
+ , domImport = choose domImport
+ , domMap = mergelm domMap
+ , domFingerprint = mergelm domFingerprint
+ , domTls = mergelm domTls
+ , domDs = mergelm domDs
+ }
+ where
+ mergelm x = merge (x sub) (x dom)
+-- Because it is not possible to define instance of merge for Strings,
+-- we have to treat string elements separately, otherwise strings are
+-- 'unioned' along with the rest of lists. Ugly, but alternatives are worse.
+ choose field = case field dom of
+ Nothing -> field sub
+ Just x -> Just x
+
+