public static @NotNull <T> ResultWithLog<T> computeWithLogging(@NotNull Computable<? extends T> recomputeValue) {
    List<String> threadLog = ourLog.get();
    boolean outermost = threadLog == null;
    if (outermost) {
      ourLog.set(threadLog = new ArrayList<>());
    }
    try {
      int start = threadLog.size();
      T result = recomputeValue.compute();
      return new ResultWithLog<>(result, new ArrayList<>(threadLog.subList(start, threadLog.size())));
    }
    finally {
      if (outermost) {
        ourLog.set(null);
      }
    }
  }
public static @NotNull <T> ResultWithLog<T> computeWithLogging(@NotNull Computable<? extends T> recomputeValue)