1use crate::ProgressEntry;
2
3pub trait Total {
4 fn total(&self) -> u64;
5}
6
7impl Total for ProgressEntry {
8 fn total(&self) -> u64 {
9 self.end.saturating_sub(self.start)
10 }
11}
12
13impl<T: Total> Total for Vec<T> {
14 fn total(&self) -> u64 {
15 self.iter().map(|r| r.total()).sum()
16 }
17}
18
19impl<T: Total> Total for [T] {
20 fn total(&self) -> u64 {
21 self.iter().map(|r| r.total()).sum()
22 }
23}
24
25impl<T: Total> Total for &T {
26 fn total(&self) -> u64 {
27 (*self).total()
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use super::*;
34
35 #[test]
36 fn test_range_total() {
37 let range = 10..20;
38 assert_eq!(range.total(), 10);
39 }
40
41 #[test]
42 fn test_vec_total() {
43 let ranges = vec![1..5, 10..15, 20..30];
44 assert_eq!(ranges.total(), (5 - 1) + (15 - 10) + (30 - 20));
45 }
46
47 #[test]
48 fn test_slice_total() {
49 let ranges = [1..5, 10..15, 20..30];
50 assert_eq!(ranges.total(), (5 - 1) + (15 - 10) + (30 - 20));
51 }
52
53 #[test]
54 fn test_empty_range() {
55 let range = 0..0;
56 assert_eq!(range.total(), 0);
57 }
58
59 #[test]
60 fn test_empty_vec() {
61 let ranges: Vec<ProgressEntry> = vec![];
62 assert_eq!(ranges.total(), 0);
63 }
64}