maplibre/util/
mod.rs

1//! Utils which are used internally
2
3use 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    /// This method tests for `self` and `other` values to be significantly different
16    #[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}