pub(crate) type CallbackType<T> = Box<dyn FnOnce(T) + Send + Sync + 'static>;
enum Inner<T> {
OneShot(tokio::sync::oneshot::Sender<T>),
#[allow(dead_code)]
CallBack(CallbackType<T>, T),
}
pub(crate) struct Promise<T> {
inner: Option<Inner<T>>,
}
impl<T> Promise<T> {
pub(crate) fn null() -> Self {
Self { inner: None }
}
fn new(inner: Inner<T>) -> Self {
Self { inner: Some(inner) }
}
pub(crate) fn one_shot() -> (Self, tokio::sync::oneshot::Receiver<T>) {
let (tx, rx) = tokio::sync::oneshot::channel();
(Self::new(Inner::OneShot(tx)), rx)
}
pub(crate) fn complete(mut self, value: T) {
if let Some(x) = self.inner.take() {
match x {
Inner::OneShot(s) => {
s.send(value).ok();
}
Inner::CallBack(cb, _) => cb(value),
}
}
}
}
impl<T> Drop for Promise<T> {
fn drop(&mut self) {
if let Some(x) = self.inner.take() {
match x {
Inner::OneShot(_) => {}
Inner::CallBack(cb, default) => {
cb(default);
}
}
}
}
}