Skip to content

Commit 5664a8d

Browse files
committed
Adds Stream::ge
1 parent 3d5562d commit 5664a8d

File tree

2 files changed

+88
-1
lines changed

2 files changed

+88
-1
lines changed

src/stream/stream/ge.rs

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use std::cmp::Ordering;
2+
use std::pin::Pin;
3+
4+
use super::partial_cmp::PartialCmpFuture;
5+
use crate::future::Future;
6+
use crate::prelude::*;
7+
use crate::stream::Stream;
8+
use crate::task::{Context, Poll};
9+
10+
// Determines if the elements of this `Stream` are lexicographically
11+
// greater than or equal to those of another.
12+
#[doc(hidden)]
13+
#[allow(missing_debug_implementations)]
14+
pub struct GeFuture<L: Stream, R: Stream> {
15+
partial_cmp: PartialCmpFuture<L, R>,
16+
}
17+
18+
impl<L: Stream, R: Stream> GeFuture<L, R>
19+
where
20+
L::Item: PartialOrd<R::Item>,
21+
{
22+
pin_utils::unsafe_pinned!(partial_cmp: PartialCmpFuture<L, R>);
23+
24+
pub(super) fn new(l: L, r: R) -> Self {
25+
GeFuture {
26+
partial_cmp: l.partial_cmp(r),
27+
}
28+
}
29+
}
30+
31+
impl<L: Stream, R: Stream> Future for GeFuture<L, R>
32+
where
33+
L: Stream + Sized,
34+
R: Stream + Sized,
35+
L::Item: PartialOrd<R::Item>,
36+
{
37+
type Output = bool;
38+
39+
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
40+
let result = futures_core::ready!(self.as_mut().partial_cmp().poll(cx));
41+
42+
match result {
43+
Some(Ordering::Greater) | Some(Ordering::Equal) => Poll::Ready(true),
44+
_ => Poll::Ready(false),
45+
}
46+
}
47+
}

src/stream/stream/mod.rs

+41-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ mod find;
3131
mod find_map;
3232
mod fold;
3333
mod fuse;
34+
mod ge;
3435
mod inspect;
3536
mod min_by;
3637
mod next;
@@ -50,6 +51,7 @@ use filter_map::FilterMap;
5051
use find::FindFuture;
5152
use find_map::FindMapFuture;
5253
use fold::FoldFuture;
54+
use ge::GeFuture;
5355
use min_by::MinByFuture;
5456
use next::NextFuture;
5557
use nth::NthFuture;
@@ -1081,7 +1083,45 @@ extension_trait! {
10811083
{
10821084
PartialCmpFuture::new(self, other)
10831085
}
1084-
1086+
1087+
#[doc = r#"
1088+
Determines if the elements of this `Stream` are lexicographically
1089+
greater than or equal to those of another.
1090+
1091+
# Examples
1092+
```
1093+
# fn main() { async_std::task::block_on(async {
1094+
#
1095+
use async_std::prelude::*;
1096+
use std::collections::VecDeque;
1097+
1098+
let single: VecDeque<isize> = vec![1].into_iter().collect();
1099+
let single_gt: VecDeque<isize> = vec![10].into_iter().collect();
1100+
let multi: VecDeque<isize> = vec![1,2].into_iter().collect();
1101+
let multi_gt: VecDeque<isize> = vec![1,5].into_iter().collect();
1102+
1103+
assert_eq!(single.clone().ge(single.clone()).await, true);
1104+
assert_eq!(single_gt.clone().ge(single.clone()).await, true);
1105+
1106+
assert_eq!(multi.clone().ge(single_gt.clone()).await, false);
1107+
assert_eq!(multi_gt.clone().ge(multi.clone()).await, true);
1108+
1109+
1110+
#
1111+
# }) }
1112+
```
1113+
"#]
1114+
fn ge<S>(
1115+
self,
1116+
other: S
1117+
) -> impl Future<Output = bool> + '_ [GeFuture<Self, S>]
1118+
where
1119+
Self: Sized + Stream,
1120+
S: Stream,
1121+
Self::Item: PartialOrd<S::Item>,
1122+
{
1123+
GeFuture::new(self, other)
1124+
}
10851125
}
10861126

10871127
impl<S: Stream + Unpin + ?Sized> Stream for Box<S> {

0 commit comments

Comments
 (0)