use std::path::PathBuf;
use crate::date_stamp::DateStamp;
pub struct OldestPathFinder {
pub oldest_path: Option<PathBuf>,
pub n_old_files: usize,
}
impl<I> From<I> for OldestPathFinder
where
I: Iterator<Item = (PathBuf, DateStamp)>,
{
fn from(path_date_stamp_iter: I) -> Self {
let (n_old_files, oldest_path, _) = path_date_stamp_iter.fold(
(0, None, u32::MAX),
|(n_old_files, oldest_path, min_date_stamp), (path, date_stamp)| {
if date_stamp < min_date_stamp {
(n_old_files + 1, Some(path), date_stamp)
} else {
(n_old_files + 1, oldest_path, min_date_stamp)
}
},
);
Self {
oldest_path,
n_old_files,
}
}
}
#[cfg(test)]
mod tests {
use std::path::PathBuf;
use crate::date_stamp::DateStamp;
use super::OldestPathFinder;
#[test]
fn correct() {
fn test<const N: usize>(
path_date_stamp_slice: [(&str, DateStamp); N],
expected: Option<&str>,
) {
let len = path_date_stamp_slice.len();
let OldestPathFinder {
oldest_path,
n_old_files,
} = OldestPathFinder::from(
path_date_stamp_slice
.into_iter()
.map(|(path, date_stamp)| (PathBuf::from(path), date_stamp)),
);
assert_eq!(n_old_files, len);
assert_eq!(oldest_path, expected.map(PathBuf::from));
}
test([], None);
test([("1", 1)], Some("1"));
test([("1", 1), ("2", 23)], Some("1"));
test([("1", 20231110), ("2", 20221110)], Some("2"));
test(
[("1", 20231110), ("2", 20221110), ("3", 25550904)],
Some("2"),
);
test(
[("1", 20201110), ("2", 20221110), ("3", 25550904)],
Some("1"),
);
}
}