private Map<?, ?> mergeMapsImpl(Map<?, ?> val1, Map<?, ?> val2, int depthRemaining, Visited visited) {
if (depthRemaining < 1) {
return val1;
}
MutableMap<Object, Object> result = MutableMap.of();
for (Object key : Sets.union(val1.keySet(), val2.keySet())) {
Maybe<?> sub1 = val1.containsKey(key) ? Maybe.of(val1.get(key)) : Maybe.absent();
Maybe<?> sub2 = val2.containsKey(key) ? Maybe.of(val2.get(key)) : Maybe.absent();
result.put(key, mergeImpl(sub1, sub2, depthRemaining-1, visited));
}
return result;
}