#![no_std]
use core::pin::Pin;
use core::task::{Context, Poll};
pub trait OrderedStream {
type Ordering: Ord;
type Data;
fn poll_next_before(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
before: Option<&Self::Ordering>,
) -> Poll<PollResult<Self::Ordering, Self::Data>>;
}
impl<P> OrderedStream for Pin<P>
where
P: core::ops::DerefMut + Unpin,
P::Target: OrderedStream,
{
type Data = <P::Target as OrderedStream>::Data;
type Ordering = <P::Target as OrderedStream>::Ordering;
fn poll_next_before(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
before: Option<&Self::Ordering>,
) -> Poll<PollResult<Self::Ordering, Self::Data>> {
self.get_mut().as_mut().poll_next_before(cx, before)
}
}
pub trait FusedOrderedStream: OrderedStream {
fn is_terminated(&self) -> bool;
}
#[derive(Debug)]
pub enum PollResult<Ordering, Data> {
Item { data: Data, ordering: Ordering },
NoneBefore,
Terminated,
}
impl<D, T> PollResult<T, D> {
pub fn into_data(self) -> Option<D> {
match self {
Self::Item { data, .. } => Some(data),
_ => None,
}
}
pub fn into_tuple(self) -> Option<(T, D)> {
match self {
Self::Item { data, ordering } => Some((ordering, data)),
_ => None,
}
}
pub fn map_data<R>(self, f: impl FnOnce(D) -> R) -> PollResult<T, R> {
match self {
Self::Item { data, ordering } => PollResult::Item {
data: f(data),
ordering,
},
Self::NoneBefore => PollResult::NoneBefore,
Self::Terminated => PollResult::Terminated,
}
}
}
impl<T, D, E> PollResult<T, Result<D, E>> {
pub fn transpose_result(self) -> Result<PollResult<T, D>, E> {
self.transpose_result_item().map_err(|(_, e)| e)
}
pub fn transpose_result_item(self) -> Result<PollResult<T, D>, (T, E)> {
match self {
Self::Item {
data: Ok(data),
ordering,
} => Ok(PollResult::Item { data, ordering }),
Self::Item {
data: Err(data),
ordering,
} => Err((ordering, data)),
Self::NoneBefore => Ok(PollResult::NoneBefore),
Self::Terminated => Ok(PollResult::Terminated),
}
}
}
pub trait OrderedFuture {
type Ordering: Ord;
type Output;
fn poll_before(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
before: Option<&Self::Ordering>,
) -> Poll<Option<(Self::Ordering, Self::Output)>>;
}
mod adapters;
pub use adapters::*;
mod join;
pub use join::*;