sclass BackupThinner { settable File dir; settable TimeZone timeZone = defaultTimeZone(); settable long currentTime = now(); settable L allFiles; gettable L deletableFiles; L files; Map ageMap; // age = age in days swappable bool shouldKeep(double age, double lastAge) { ret defaultAgeBasedBackupRetentionStrategy_shouldKeep(age, lastAge); } void scan { if (allFiles == null) allFiles = listFilesNotDirs(dir); deletableFiles = new L; files = new L; ageMap = new Map; for (File f : allFiles) { var bfa = new BackupFileAge().timeZone(timeZone).currentTime(currentTime); if (!bfa.fileName(f.getName()).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; } } }