use std::{ cell::{RefCell, UnsafeCell}, collections::HashMap, sync::Arc, }; use generational_arena::Arena; use crate::innerlude::*; type Rc = Arc; #[derive(Clone)] pub struct ScopeArena(Rc>); struct ScopeArenaInner { pub(crate) arena: UnsafeCell>, locks: HashMap, } enum MutStatus { Immut, Mut, } impl ScopeArena { pub fn new(arena: Arena) -> Self { ScopeArena(Rc::new(RefCell::new(ScopeArenaInner { arena: UnsafeCell::new(arena), locks: Default::default(), }))) } /// THIS METHOD IS CURRENTLY UNSAFE /// THERE ARE NO CHECKS TO VERIFY THAT WE ARE ALLOWED TO DO THIS pub fn try_get(&self, idx: ScopeIdx) -> Result<&Scope> { let inner = unsafe { &*self.0.borrow().arena.get() }; let scope = inner.get(idx); scope.ok_or_else(|| Error::FatalInternal("Scope not found")) } /// THIS METHOD IS CURRENTLY UNSAFE /// THERE ARE NO CHECKS TO VERIFY THAT WE ARE ALLOWED TO DO THIS pub fn try_get_mut(&self, idx: ScopeIdx) -> Result<&mut Scope> { let inner = unsafe { &mut *self.0.borrow().arena.get() }; let scope = inner.get_mut(idx); scope.ok_or_else(|| Error::FatalInternal("Scope not found")) } fn inner(&self) -> &Arena { todo!() } fn inner_mut(&mut self) -> &mut Arena { todo!() } /// THIS METHOD IS CURRENTLY UNSAFE /// THERE ARE NO CHECKS TO VERIFY THAT WE ARE ALLOWED TO DO THIS pub fn with(&self, f: impl FnOnce(&mut Arena) -> T) -> Result { let inner = unsafe { &mut *self.0.borrow().arena.get() }; Ok(f(inner)) // todo!() } unsafe fn inner_unchecked<'s>() -> &'s mut Arena { todo!() } }