async_ecs/resource/
entry.rs1use std::marker::PhantomData;
2
3use hashbrown::hash_map::{DefaultHashBuilder, Entry as HbEntry};
4
5use super::{cell::Cell, RefMut, Resource, ResourceId};
6
7pub struct Entry<'a, T: 'a> {
8 inner: Inner<'a>,
9 marker: PhantomData<T>,
10}
11
12pub type Inner<'a> = HbEntry<'a, ResourceId, Cell<Box<dyn Resource>>, DefaultHashBuilder>;
13
14impl<'a, T> Entry<'a, T>
31where
32 T: Resource + 'a,
33{
34 pub fn new(inner: Inner<'a>) -> Self {
36 Self {
37 inner,
38 marker: PhantomData,
39 }
40 }
41
42 pub fn or_insert(self, v: T) -> RefMut<'a, T> {
47 self.or_insert_with(move || v)
48 }
49
50 pub fn or_insert_with<F>(self, f: F) -> RefMut<'a, T>
53 where
54 F: FnOnce() -> T,
55 {
56 let inner = self.inner.or_insert_with(move || Cell::new(Box::new(f())));
57 let inner = inner.borrow_mut().map(Box::as_mut);
58
59 RefMut::new(inner)
60 }
61}