class LargeFileSorter {

    public File sortLargeFile(File inputFile) throws IOException {

        try (LargeFileReader<T> reader = this.fileReaderFactory.apply(inputFile)) {
            List<File> filesToMerge = splitIntoInitialSortedChunkFiles(reader);
            return mergeSortFiles(filesToMerge);
        }
    }

    public  LargeFileSorter(
        Function<File, LargeFileReader<T>> fileReaderFactory,
        Function<File, LargeFileWriter<T>> fileWriterFactory,
        Comparator<T> entryComparator,
        Supplier<File> tempFileCreator);
    @VisibleForTesting  LargeFileSorter(
        int initialFileChunkSizeToSortInMemory, int nbFilesToMergeSort,
        Function<File, LargeFileReader<T>> fileReaderFactory,
        Function<File, LargeFileWriter<T>> fileWriterFactory,
        Comparator<T> entryComparator,
        Supplier<File> tempFileCreator);

}