Skip to main content

loam_runtime/
value.rs

1use crate::entity::SceneId;
2use crate::store::{Owner, StoreField, Version};
3
4pub struct Value<T> {
5    value: T,
6    version: Version,
7}
8
9impl<T> Value<T> {
10    pub fn new(value: T) -> Self {
11        Self {
12            value,
13            version: Version::default(),
14        }
15    }
16
17    pub fn get(&self) -> &T {
18        &self.value
19    }
20
21    pub fn get_mut(&mut self) -> &mut T {
22        self.version = self.version.bump();
23        &mut self.value
24    }
25
26    pub fn set(&mut self, value: T) {
27        *self.get_mut() = value;
28    }
29
30    pub fn version(&self) -> Version {
31        self.version
32    }
33}
34
35impl<T: Default> Default for Value<T> {
36    fn default() -> Self {
37        Self::new(T::default())
38    }
39}
40
41impl<T: Clone + Send + 'static> StoreField for Value<T> {
42    type Snapshot = T;
43
44    fn bind(&mut self, _scene: SceneId, _owner: Owner) {}
45
46    fn snapshot(&self) -> T {
47        self.value.clone()
48    }
49
50    fn restore(&mut self, from: &T, _scene: SceneId, _owner: Owner) {
51        self.set(from.clone());
52    }
53}