docs: public void add(int var, Type t) {
      Set<Integer> tVars = t.getTypeVariables();
      Set<Integer> intersection = Sets.intersection(tVars, bindings.keySet());
      Preconditions.checkArgument(intersection.size() == 0,
          "Tried to replace %s with %s, but already have bindings for %s", var, t, intersection);
      Preconditions.checkArgument(!tVars.contains(var),
          "Recursive replacement: tried to replace %s with %s", var, t);
      
      Map<Integer, Type> newBinding = Maps.newHashMap();
      newBinding.put(var, t);
      for (int boundVar : bindings.keySet()) {
        bindings.put(boundVar, bindings.get(boundVar).substitute(newBinding));
      }
      bindings.put(var, t);
    }