1use std::ops::{Deref, DerefMut};
4
5pub use fps_meter::FPSMeter;
6
7mod fps_meter;
8pub mod grid;
9pub mod label;
10pub mod math;
11
12pub trait SignificantlyDifferent<Rhs: ?Sized = Self> {
13 type Epsilon;
14
15 #[must_use]
17 fn ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool;
18}
19
20#[derive(Clone)]
21pub struct ChangeObserver<T> {
22 inner: T,
23 reference_value: Option<T>,
24}
25
26impl<T> ChangeObserver<T> {
27 pub fn new(value: T) -> Self {
28 Self {
29 inner: value,
30 reference_value: None,
31 }
32 }
33}
34
35impl<T> ChangeObserver<T>
36where
37 T: Clone + SignificantlyDifferent,
38{
39 pub fn update_reference(&mut self) {
40 self.reference_value = Some(self.inner.clone());
41 }
42
43 pub fn did_change(&self, epsilon: T::Epsilon) -> bool {
44 if let Some(reference_value) = &self.reference_value {
45 reference_value.ne(&self.inner, epsilon)
46 } else {
47 true
48 }
49 }
50}
51
52impl<T> Default for ChangeObserver<T>
53where
54 T: Default,
55{
56 fn default() -> Self {
57 ChangeObserver::new(T::default())
58 }
59}
60
61impl<T> Deref for ChangeObserver<T> {
62 type Target = T;
63
64 fn deref(&self) -> &Self::Target {
65 &self.inner
66 }
67}
68
69impl<T> DerefMut for ChangeObserver<T> {
70 fn deref_mut(&mut self) -> &mut Self::Target {
71 &mut self.inner
72 }
73}