#[derive(Default, Debug, Clone, PartialEq, Eq)]
#[repr(transparent)]
struct CachedDesiredControllersAndOurDepth(RefCell<Option<(Controllers, usize)>>);
impl CachedDesiredControllersAndOurDepth
{
fn get(&self, constructor: impl FnOnce() -> (Controllers, usize)) -> (&Controllers, usize)
{
let is_uncached = self.0.borrow().is_none();
if is_uncached
{
*self.0.borrow_mut() = Some(constructor())
}
self.get_cached()
}
#[inline(always)]
fn get_cached(&self) -> (&Controllers, usize)
{
let borrow = self.0.borrow();
let (left, right) = Ref::map_split(borrow, |option| match option
{
&None => panic!(),
&Some((ref left, ref right)) => (left, right)
});
let left = Ref::leak(left);
let right = *right;
(left, right)
}
}