use crate::MaybeBorrowed;
use core::pin::Pin;
use core::task::{Context, Poll};
use futures_core::Stream;
pub trait OrderedBy<Ordering: Ord> {
fn ordering(&self) -> MaybeBorrowed<'_, Ordering>;
}
impl<T: Ord> OrderedBy<T> for T {
fn ordering(&self) -> MaybeBorrowed<'_, T> {
MaybeBorrowed::Borrowed(self)
}
}
pub trait StreamOrderedBy<Ordering: Ord>: Stream
where
Self::Item: OrderedBy<Ordering>,
{
fn position_hint(&self) -> Option<MaybeBorrowed<'_, Ordering>> {
None
}
fn poll_position(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Option<MaybeBorrowed<'_, Ordering>>;
fn poll_next_and_position(self: Pin<&mut Self>, cx: &mut Context<'_>) -> (Poll<Option<Self::Item>>, Option<MaybeBorrowed<'_, Ordering>>) {
let mut this = self;
let next = this.as_mut().poll_next(cx);
let pos = this.poll_position(cx);
(next, pos)
}
}