infinite_stream/
from_future.rs

1use crate::internal_prelude::*;
2
3pub fn from_future<S: InfiniteStream, Fut: Future<Output = S>>(fut: Fut) -> FromFuture<S, Fut> {
4    assert_infinite_stream::<S::Item, _>(FromFuture { state: FromFutureState::Init(fut) })
5}
6
7#[pin_project]
8#[must_use = "streams do nothing unless polled"]
9pub struct FromFuture<S, Fut> {
10    #[pin]
11    state: FromFutureState<S, Fut>,
12}
13
14#[pin_project(project = FromFutureStateProj)]
15enum FromFutureState<S, Fut> {
16    Init(#[pin] Fut),
17    Stream(#[pin] S),
18}
19
20impl<S: InfiniteStream, Fut: Future<Output = S>> InfiniteStream for FromFuture<S, Fut> {
21    type Item = S::Item;
22
23    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Item> {
24        let mut this = self.project();
25        let stream = match this.state.as_mut().project() {
26            FromFutureStateProj::Init(fut) => {
27                let stream = ready!(fut.poll(cx));
28                this.state.set(FromFutureState::Stream(stream));
29                match this.state.as_mut().project() {
30                    FromFutureStateProj::Stream(stream) => stream,
31                    _ => unreachable!(),
32                }
33            }
34            FromFutureStateProj::Stream(stream) => stream,
35        };
36        stream.poll_next(cx)
37    }
38}