1use std::{fmt::Debug, ops::Add, time::SystemTime};
2
3pub trait Resource : Debug {
17
18 fn timestamp(&self) -> Option<SystemTime>;
24
25 fn mk_from<F, R, S>(&self, description: &str, src: S, by: F)
34 where R:Resource, S:AsResource<R>, F: FnOnce() -> ()
35 {
36 let src = src.as_res();
37 let target_time = self.timestamp();
38 if target_time == None || src.timestamp() > target_time {
39 println!("Building: {:?} from {:?}: {}", self, src, description);
40 by();
41 }
42 }
43
44 fn mk_from_result<E, F, R, S>(&self, description: &str, src: S, by: F) -> Result<(), E>
47 where R:Resource, S:AsRef<R>, F: FnOnce() -> Result<(), E>
48 {
49 let src = src.as_ref();
50 let target_time = self.timestamp();
51 if target_time == None || src.timestamp() > target_time {
52 println!("Building: {:?} from {:?}: {}", self, src, description);
53 return by()
54 }
55
56 Ok(())
57 }
58}
59
60pub trait AsResource<R> {
61 fn as_res(&self) -> &R;
62}
63
64impl<R> AsResource<R> for R where R:Resource {
65 fn as_res(&self) -> &R {
66 &self
67 }
68}
69
70impl<R> AsResource<R> for &R where R:Resource {
71 fn as_res(&self) -> &R {
72 self
73 }
74}
75
76impl<R> Resource for Vec<R>
79 where R:Resource
80{
81 fn timestamp(&self) -> Option<SystemTime> {
82 timestamp(self.iter())
83 }
84}
85
86pub fn timestamp<T: AsResource<R>, R: Resource>(iter: impl Iterator<Item=T>) -> Option<SystemTime> {
88 iter.fold(None, |result, entry| {
89 let timestamp = entry.as_res().timestamp();
90 if timestamp > result {
91 return timestamp;
92 }
93 result
94 })
95}
96
97#[derive(Debug,Clone)]
105pub struct Set<T> {
106 items: Vec<T>
107}
108
109impl<R> Add<&R> for Set<R> where R: Clone {
110 type Output = Set<R>;
111
112 fn add(mut self, rhs: &R) -> Self::Output {
113 self.items.push(rhs.clone());
114 self
115 }
116}
117
118impl<R> Add<R> for Set<R> {
119 type Output = Set<R>;
120
121 fn add(mut self, rhs: R) -> Self::Output {
122 self.items.push(rhs);
123 self
124 }
125}
126
127impl<T> AsRef<Set<T>> for Set<T> {
128 fn as_ref(&self) -> &Set<T> {
129 self
130 }
131}
132
133impl<T> From<Vec<T>> for Set<T> {
134 fn from(val: Vec<T>) -> Self {
135 Set { items: val }
136 }
137}
138
139impl<T> IntoIterator for Set<T> {
140 type Item = T;
141 type IntoIter = std::vec::IntoIter<Self::Item>;
142
143 fn into_iter(self) -> Self::IntoIter {
144 self.items.into_iter()
145 }
146}
147
148impl<R> Resource for Set<R> where R:Resource {
149
150 fn timestamp(&self) -> Option<SystemTime> {
151 self.items.timestamp()
152 }
153}