use super::Inner;
use alloc::arc::Arc;
use sync::spsc::SpscInner;
pub struct Sender<T, E> {
inner: Arc<Inner<T, E>>,
}
impl<T, E> Sender<T, E> {
#[inline(always)]
pub(super) fn new(inner: Arc<Inner<T, E>>) -> Self {
Self { inner }
}
#[inline(always)]
pub fn send(self, data: Result<T, E>) -> Result<(), Result<T, E>> {
self.inner.send(data)
}
#[inline(always)]
pub fn poll_cancel(&mut self) -> Poll<(), ()> {
self.inner.poll_cancel()
}
#[inline(always)]
pub fn is_canceled(&self) -> bool {
self.inner.is_canceled()
}
}
impl<T, E> Drop for Sender<T, E> {
#[inline(always)]
fn drop(&mut self) {
self.inner.drop_tx();
}
}
impl<T, E> Inner<T, E> {
fn send(&self, data: Result<T, E>) -> Result<(), Result<T, E>> {
if self.is_canceled() {
Err(data)
} else {
unsafe { *self.data.get() = Some(data) };
Ok(())
}
}
}