You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.2 KiB

use super::*;
use pin_project::pin_project;
use std::{
pin::Pin,
task::{Context, Poll},
};
#[pin_project]
#[derive(Debug, Clone)]
pub struct MaybeStream<I,T>(#[pin] Option<I>)
where I: Stream<Item=T>;
pub trait OptionStreamExt<I, T>: Sized
where I: Stream<Item=T>
{
/// Map this `Option<Stream>` into a stream that will yield the items of the stream if it is present.
fn map_into_stream(self) -> MaybeStream<I,T>;
}
impl<I: Stream<Item=T>, T> Stream for MaybeStream<I,T>
{
type Item = T;
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
match self.project().0.as_pin_mut()
{
Some(i) => i.poll_next(cx),
_ => Poll::Ready(None),
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
match &self.0 {
Some(i) => i.size_hint(),
None => (0, Some(0)),
}
}
}
impl<E, T, I: Stream<Item=T>> OptionStreamExt<I, T> for Result<I, E>
where I: Stream<Item = T>
{
#[inline] fn map_into_stream(self) -> MaybeStream<I, T> {
MaybeStream(self.ok())
}
}
impl<T, I: Stream<Item=T>> OptionStreamExt<I, T> for Option<I>
where I: Stream<Item = T>
{
#[inline] fn map_into_stream(self) -> MaybeStream<I, T> {
MaybeStream(self)
}
}