sclass BackupThinner { settable File dir; settable TimeZone timeZone = defaultTimeZone(); settable long currentTime = now(); L allFiles; new L files; new Map ageMap; gettable new L deletableFiles; // age = age in days swappable bool shouldKeep(double age, double lastAge) { ret defaultAgeBasedBackupRetentionStrategy_shouldKeep(age, lastAge); } void scan { if (allFiles == null) allFiles = listFilesNotDirs(dir); for (File f : allFiles) { var bfa = new BackupFileAge().timeZone(timeZone).currentTime(currentTime); if (!bfa.parse()) continue; continue unless eq(bfa.originalName, "concepts.structure.gz"); ageMap.put(f, bfa.ageInDays()); files.add(f); } sortByMap_inPlace(files, ageMap); double lastAge = -1; for (File f : files) { double age = ageMap.get(f); if (!shouldKeep(age, lastAge)) deletableFiles.add(f); else lastAge = age; } } }