enstream 0.3.0

Conversion from Future to Stream
Documentation
#![feature(type_alias_impl_trait)]

use std::{future::Future, task, task::Poll};

use enstream::{enstream, HandlerFn, HandlerFnLifetime, Yielder};
use futures_util::{stream::Stream, task::noop_waker_ref};

struct YieldsInDrop<'stream> {
    yielder: Yielder<'stream, Box<u32>>,
}

impl<'stream> Drop for YieldsInDrop<'stream> {
    fn drop(&mut self) {
        let mut cx = task::Context::from_waker(noop_waker_ref());
        let mut fut = Box::pin(self.yielder.yield_item(Box::new(0)));
        assert_eq!(fut.as_mut().poll(&mut cx), Poll::Pending);
    }
}

struct Handler;
type Fut<'yielder> = impl Future<Output = ()>;
impl<'yielder> HandlerFnLifetime<'yielder, Box<u32>> for Handler {
    type Fut = Fut<'yielder>;
}
impl HandlerFn<Box<u32>> for Handler {
    fn call(
        self,
        yielder: Yielder<'_, Box<u32>>,
    ) -> <Self as HandlerFnLifetime<'_, Box<u32>>>::Fut {
        async {
            let _yields_in_drop = YieldsInDrop { yielder };
            std::future::pending().await
        }
    }
}

#[test]
fn test() {
    let mut cx = task::Context::from_waker(noop_waker_ref());

    let mut stream = Box::pin(enstream(Handler));
    assert_eq!(stream.as_mut().poll_next(&mut cx), Poll::Pending);
    drop(stream);
}