1use std::cell::{Ref, RefMut};
2
3use generational_box::{
4 GenerationalBox, GenerationalRef, GenerationalRefMut, Owner, UnsyncStorage,
5};
6
7#[derive(Default)]
8pub(crate) struct StateOwner {
9 inner: Owner<UnsyncStorage>,
10}
11
12impl StateOwner {
13 pub fn insert<T: 'static>(&self, value: T) -> State<T> {
14 let inner = self.inner.insert(value);
15 State { inner }
16 }
17}
18
19#[derive(Debug)]
20pub struct State<T> {
21 inner: GenerationalBox<T>,
22}
23
24impl<T> Clone for State<T> {
25 fn clone(&self) -> Self {
26 *self
27 }
28}
29
30impl<T> Copy for State<T> {}
31
32impl<T: 'static> State<T> {
33 pub fn read(&self) -> GenerationalRef<Ref<'_, T>> {
34 self.inner.read()
35 }
36
37 pub fn write(&mut self) -> GenerationalRefMut<RefMut<'_, T>> {
38 self.inner.write()
39 }
40}