use crate::AQueue;
use crate::inner_store::InnerStore;
use std::future::Future;
use std::ops::Deref;
pub struct Actor<I> {
inner: InnerStore<I>,
queue: AQueue,
}
impl<I: Default> Default for Actor<I> {
fn default() -> Self {
Self {
inner: InnerStore::new(Default::default()),
queue: AQueue::new(),
}
}
}
pub struct RefInner<'a, T: ?Sized> {
pub(crate) value: &'a T,
}
impl<T: ?Sized> Deref for RefInner<'_, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.value
}
}
impl<I> Actor<I> {
#[inline]
pub fn new(x: I) -> Actor<I> {
Actor {
inner: InnerStore::new(x),
queue: AQueue::new(),
}
}
#[inline]
pub async fn inner_call<'a, T, R>(&'a self, call: impl FnOnce(&'a InnerStore<I>) -> T) -> R
where
T: Future<Output = R>,
{
self.queue.run(call, &self.inner).await
}
#[inline]
pub unsafe fn deref_inner(&self) -> RefInner<'_, I> {
RefInner { value: self.inner.get() }
}
}