@Override
      public DirtyFilesHolder<R, T> create() {
        return new DirtyFilesHolder<>() {
          @Override
          public void processDirtyFiles(@NotNull FileProcessor<R, T> processor) throws IOException {
            for (Map.Entry<T, Map<R, Set<File>>> entry : dirtyFiles.entrySet()) {
              final T target = entry.getKey();
              for (Map.Entry<R, Set<File>>  targetEntry: entry.getValue().entrySet()) {
                final R rd = targetEntry.getKey();
                for (File file : targetEntry.getValue()) {
                  processor.apply(target, file, rd);
                }
              }
            }
          }

          @Override
          public boolean hasDirtyFiles() {
            return !dirtyFiles.isEmpty();
          }

          @Override
          public boolean hasRemovedFiles() {
            return false;
          }

          @Override
          public @NotNull Collection<String> getRemovedFiles(@NotNull T target) {
            return Collections.emptyList();
          }
        };
      }
@Override
      public DirtyFilesHolder<R, T> create()