docs: public static ConceptMap mergeAnswers(ConceptMap answerA, ConceptMap answerB) {
          if (answerB.isEmpty()) return answerA;
          if (answerA.isEmpty()) return answerB;
  
          Sets.SetView<Variable> varUnion = Sets.union(answerA.vars(), answerB.vars());
          Set<Variable> varIntersection = Sets.intersection(answerA.vars(), answerB.vars());
          Map<Variable, Concept> entryMap = Sets.union(
                  answerA.map().entrySet(),
                  answerB.map().entrySet()
          )
                  .stream()
                  .filter(e -> !varIntersection.contains(e.getKey()))
                  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
          varIntersection
                  .forEach(var -> {
                      Concept concept = answerA.get(var);
                      Concept otherConcept = answerB.get(var);
                      if (concept.equals(otherConcept)) entryMap.put(var, concept);
                      else {
                          if (concept.isSchemaConcept()
                                  && otherConcept.isSchemaConcept()
                                  && !ConceptUtils.areDisjointTypes(concept.asSchemaConcept(), otherConcept.asSchemaConcept(), false)) {
                              entryMap.put(
                                      var,
                                      Iterables.getOnlyElement(ConceptUtils.topOrMeta(
                                              Sets.newHashSet(
                                                      concept.asSchemaConcept(),
                                                      otherConcept.asSchemaConcept())
                                                               )
                                      )
                              );
                          }
                      }
                  });
          if (!entryMap.keySet().equals(varUnion)) return new ConceptMap();
          return new ConceptMap(entryMap, answerA.explanation());
      }