deep merge maps
authorEugene Crosser <crosser@average.org>
Mon, 14 Apr 2014 14:32:07 +0000 (18:32 +0400)
committerEugene Crosser <crosser@average.org>
Mon, 14 Apr 2014 14:32:07 +0000 (18:32 +0400)
NmcDom.hs
d/extra1
d/extra2

index adb378999a064e81ce759d9b3d3e7c61a0dd34a0..7eb4ee6d1f83e6906a769923d46ae1fcaf97e571 100644 (file)
--- a/NmcDom.hs
+++ b/NmcDom.hs
@@ -13,7 +13,7 @@ import Data.Text (Text, unpack)
 import Data.List as L (union)
 import Data.List.Split
 import Data.Char
-import Data.Map as M (Map, lookup, delete, size, union)
+import Data.Map as M (Map, lookup, delete, size, unionWith)
 import Data.Vector (toList,(!),length, singleton)
 import Control.Applicative ((<$>), (<*>), empty, pure)
 import Data.Aeson
@@ -37,8 +37,8 @@ obj .:/ key = case H.lookup key obj of
 class Mergeable a where
         merge :: a -> a -> a -- bias towads second arg
 
-instance Ord k => Mergeable (Map k a) where
-        merge mx my = M.union my mx
+instance (Ord k, Mergeable a) => Mergeable (Map k a) where
+        merge mx my = M.unionWith merge my mx
 
 -- instance Mergeable String where
 --         merge _ b = b
index b0fdcf545e4cbb27a96c0f3ad517afb3a882a023..19bfa436f644c38f7b0206f3c4769f63aab269c9 100644 (file)
--- a/d/extra1
+++ b/d/extra1
@@ -1 +1 @@
-{"service":[["smtp", "tcp", 0, 0, 25, "mail.host.com."]],"import":"d/extra2","ip":["1.2.3.4"],"alias":"extra1alias"}
+{"service":[["smtp", "tcp", 0, 0, 25, "mail.host.com."]],"import":"d/extra2","ip":["1.2.3.4"],"alias":"extra1alias","map":{"mail":"1.1.1.1","www":"1.1.1.1"}}
index c89910506ebaa1c6a5f571d9c861b0506fa77d1c..78de00ea2da83cc95d4e23a840c3e53781aeb7e7 100644 (file)
--- a/d/extra2
+++ b/d/extra2
@@ -1 +1 @@
-{"ip":["5.6.7.8"],"alias":"extra2alias","service":[["imap", "tcp", 0, 0, 143, "mail.host.com."]]}
+{"ip":["5.6.7.8"],"alias":"extra2alias","service":[["imap", "tcp", 0, 0, 143, "mail.host.com."]],"map":{"ftp":"2.2.2.2","www":"2.2.2.2"}}