+takeMap o =
+ case H.lookup "map" o of
+ Nothing -> pure Nothing
+ Just (Object mo) -> H.foldrWithKey addmapentry (pure (Just M.empty)) mo
+ where
+ addmapentry "" v acc = parseJSON v >>= inject acc ""
+ addmapentry k v acc = nest (splitOn "." (unpack k)) v acc
+ nest [] v acc = empty -- does not happen as a result of splitOn
+ nest [""] v acc = empty -- empty element of fqdn forbidden
+ nest [d] v acc = parseJSON v >>= inject acc d
+ nest (d:ds) v acc =
+ nest ds v acc >>= (inject acc d) . (\r -> def { domSubmap = r })
+ inject acc d r = (fmap.fmap) (M.insertWith merge d r) acc
+ _ -> empty