use crate::{core, core::Next};
use std::{cell::UnsafeCell, ptr};
pub struct Airlock<Y, R>(UnsafeCell<Next<Y, R>>);
impl<Y, R> Default for Airlock<Y, R> {
fn default() -> Self {
Self(UnsafeCell::new(Next::Empty))
}
}
impl<'s, Y, R> core::Airlock for &'s Airlock<Y, R> {
type Yield = Y;
type Resume = R;
fn peek(&self) -> Next<(), ()> {
let inner = unsafe { &*self.0.get() };
inner.without_values()
}
fn replace(
&self,
next: Next<Self::Yield, Self::Resume>,
) -> Next<Self::Yield, Self::Resume> {
unsafe { ptr::replace(self.0.get(), next) }
}
}
pub type Co<'y, Y, R = ()> = core::Co<&'y Airlock<Y, R>>;