1use std::cell::{Ref, RefMut};
2
3use generational_box::{
4 AnyStorage, 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 new() -> Self {
14 let inner = UnsyncStorage::owner();
15 Self { inner }
16 }
17
18 pub fn insert<T: 'static>(&self, value: T) -> State<T> {
19 let inner = self.inner.insert(value);
20 State { inner }
21 }
22}
23
24#[derive(Clone, Copy, Debug)]
25pub struct State<T> {
26 inner: GenerationalBox<T>,
27}
28
29impl<T: 'static> State<T> {
30 pub fn read(&self) -> GenerationalRef<Ref<'_, T>> {
31 self.inner.read()
32 }
33
34 pub fn write(&mut self) -> GenerationalRefMut<RefMut<'_, T>> {
35 self.inner.write()
36 }
37}