Skip to content

Commit a64ec76

Browse files
Markus Westerlindcramertj
Markus Westerlind
authored andcommitted
feat: Rename future::empty to pending and add stream::pending
Fixes the inconsistency between `future::empty` and `stream::empty`. I went with `pending` over `never` since there are already a future called `Never` in the library. Closes #1624
1 parent d9ced4e commit a64ec76

File tree

9 files changed

+83
-36
lines changed

9 files changed

+83
-36
lines changed

futures-executor/src/local_pool.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,14 @@ impl LocalPool {
170170
/// ```
171171
/// use futures::executor::LocalPool;
172172
/// use futures::task::LocalSpawnExt;
173-
/// use futures::future::{ready, empty};
173+
/// use futures::future::{ready, pending};
174174
///
175175
/// let mut pool = LocalPool::new();
176176
/// let mut spawner = pool.spawner();
177177
///
178178
/// spawner.spawn_local(ready(())).unwrap();
179179
/// spawner.spawn_local(ready(())).unwrap();
180-
/// spawner.spawn_local(empty()).unwrap();
180+
/// spawner.spawn_local(pending()).unwrap();
181181
///
182182
/// // Run the two ready tasks and return true for them.
183183
/// pool.try_run_one(); // returns true after completing one of the ready futures
@@ -210,14 +210,14 @@ impl LocalPool {
210210
/// ```
211211
/// use futures::executor::LocalPool;
212212
/// use futures::task::LocalSpawnExt;
213-
/// use futures::future::{ready, empty};
213+
/// use futures::future::{ready, pending};
214214
///
215215
/// let mut pool = LocalPool::new();
216216
/// let mut spawner = pool.spawner();
217217
///
218218
/// spawner.spawn_local(ready(())).unwrap();
219219
/// spawner.spawn_local(ready(())).unwrap();
220-
/// spawner.spawn_local(empty()).unwrap();
220+
/// spawner.spawn_local(pending()).unwrap();
221221
///
222222
/// // Runs the two ready task and returns.
223223
/// // The empty task remains in the pool.

futures-test/src/future/assert_unmoved.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl<Fut> Drop for AssertUnmoved<Fut> {
6363
mod tests {
6464
use futures_core::future::Future;
6565
use futures_core::task::{Context, Poll};
66-
use futures_util::future::empty;
66+
use futures_util::future::pending;
6767
use futures_util::task::noop_waker;
6868
use std::pin::Pin;
6969

@@ -72,7 +72,7 @@ mod tests {
7272
#[test]
7373
fn dont_panic_when_not_polled() {
7474
// This shouldn't panic.
75-
let future = AssertUnmoved::new(empty::<()>());
75+
let future = AssertUnmoved::new(pending::<()>());
7676
drop(future);
7777
}
7878

@@ -84,7 +84,7 @@ mod tests {
8484
let mut cx = Context::from_waker(&waker);
8585

8686
// First we allocate the future on the stack and poll it.
87-
let mut future = AssertUnmoved::new(empty::<()>());
87+
let mut future = AssertUnmoved::new(pending::<()>());
8888
let pinned_future = unsafe { Pin::new_unchecked(&mut future) };
8989
assert_eq!(pinned_future.poll(&mut cx), Poll::Pending);
9090

futures-util/src/async_await/select_mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ macro_rules! document_select_macro {
3232
/// use futures::future;
3333
/// use futures::select;
3434
/// let mut a = future::ready(4);
35-
/// let mut b = future::empty::<()>();
35+
/// let mut b = future::pending::<()>();
3636
///
3737
/// let res = select! {
3838
/// a_res = a => a_res + 1,
@@ -49,7 +49,7 @@ macro_rules! document_select_macro {
4949
/// use futures::stream::{self, StreamExt};
5050
/// use futures::select;
5151
/// let mut st = stream::iter(vec![2]).fuse();
52-
/// let mut fut = future::empty::<()>();
52+
/// let mut fut = future::pending::<()>();
5353
///
5454
/// select! {
5555
/// x = st.next() => assert_eq!(Some(2), x),

futures-util/src/future/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ use futures_core::future::{BoxFuture, LocalBoxFuture};
1717
pub use futures_core::future::FusedFuture;
1818

1919
// Primitive futures
20-
mod empty;
21-
pub use self::empty::{empty, Empty};
22-
2320
mod lazy;
2421
pub use self::lazy::{lazy, Lazy};
2522

23+
mod pending;
24+
pub use self::pending::{pending, Pending};
25+
2626
mod maybe_done;
2727
pub use self::maybe_done::{maybe_done, MaybeDone};
2828

futures-util/src/future/empty.rs renamed to futures-util/src/future/pending.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
use core::marker;
22
use core::pin::Pin;
3-
use futures_core::future::{Future, FusedFuture};
3+
use futures_core::future::{FusedFuture, Future};
44
use futures_core::task::{Context, Poll};
55

6-
/// Future for the [`empty`] function.
6+
/// Future for the [`pending`] function.
77
#[derive(Debug)]
88
#[must_use = "futures do nothing unless you `.await` or poll them"]
9-
pub struct Empty<T> {
9+
pub struct Pending<T> {
1010
_data: marker::PhantomData<T>,
1111
}
1212

13-
impl<T> FusedFuture for Empty<T> {
14-
fn is_terminated(&self) -> bool { false }
13+
impl<T> FusedFuture for Pending<T> {
14+
fn is_terminated(&self) -> bool {
15+
false
16+
}
1517
}
1618

1719
/// Creates a future which never resolves, representing a computation that never
@@ -26,16 +28,18 @@ impl<T> FusedFuture for Empty<T> {
2628
/// # futures::executor::block_on(async {
2729
/// use futures::future;
2830
///
29-
/// let future = future::empty();
31+
/// let future = future::pending();
3032
/// let () = future.await;
3133
/// unreachable!();
3234
/// # });
3335
/// ```
34-
pub fn empty<T>() -> Empty<T> {
35-
Empty { _data: marker::PhantomData }
36+
pub fn pending<T>() -> Pending<T> {
37+
Pending {
38+
_data: marker::PhantomData,
39+
}
3640
}
3741

38-
impl<T> Future for Empty<T> {
42+
impl<T> Future for Pending<T> {
3943
type Output = T;
4044

4145
fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<T> {

futures-util/src/stream/pending.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use core::marker;
2+
use core::pin::Pin;
3+
4+
use futures_core::{Stream, Poll};
5+
use futures_core::task;
6+
7+
/// A stream which never returns any elements.
8+
///
9+
/// This stream can be created with the `stream::pending` function.
10+
#[derive(Debug)]
11+
#[must_use = "streams do nothing unless polled"]
12+
pub struct Pending<T> {
13+
_data: marker::PhantomData<T>,
14+
}
15+
16+
/// Creates a stream which never returns any elements.
17+
///
18+
/// The returned stream will always return `Pending` when polled.
19+
pub fn pending<T>() -> Pending<T> {
20+
Pending { _data: marker::PhantomData }
21+
}
22+
23+
impl<T> Stream for Pending<T> {
24+
type Item = T;
25+
26+
fn poll_next(self: Pin<&mut Self>, _: &mut task::Context<'_>) -> Poll<Option<Self::Item>> {
27+
Poll::Pending
28+
}
29+
}

futures/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,9 @@ pub mod future {
211211
pub use futures_core::future::BoxFuture;
212212

213213
pub use futures_util::future::{
214-
empty, Empty,
215214
lazy, Lazy,
216215
maybe_done, MaybeDone,
216+
pending, Pending,
217217
poll_fn, PollFn,
218218
ready, ok, err, Ready,
219219
select, Select,

futures/tests/futures_unordered.rs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ use futures::executor::{block_on, block_on_stream};
33
use futures::future::{self, join, Future, FutureExt};
44
use futures::stream::{FusedStream, FuturesUnordered, StreamExt};
55
use futures::task::Poll;
6-
use futures_test::{assert_stream_done, assert_stream_next};
76
use futures_test::future::FutureTestExt;
87
use futures_test::task::noop_context;
8+
use futures_test::{assert_stream_done, assert_stream_next};
99

1010
#[test]
1111
fn is_terminated() {
@@ -40,7 +40,11 @@ fn works_1() {
4040
let (b_tx, b_rx) = oneshot::channel::<i32>();
4141
let (c_tx, c_rx) = oneshot::channel::<i32>();
4242

43-
let mut iter = block_on_stream(vec![a_rx, b_rx, c_rx].into_iter().collect::<FuturesUnordered<_>>());
43+
let mut iter = block_on_stream(
44+
vec![a_rx, b_rx, c_rx]
45+
.into_iter()
46+
.collect::<FuturesUnordered<_>>(),
47+
);
4448

4549
b_tx.send(99).unwrap();
4650
assert_eq!(Some(Ok(99)), iter.next());
@@ -61,7 +65,9 @@ fn works_2() {
6165
let mut stream = vec![
6266
a_rx.boxed(),
6367
join(b_rx, c_rx).map(|(a, b)| Ok(a? + b?)).boxed(),
64-
].into_iter().collect::<FuturesUnordered<_>>();
68+
]
69+
.into_iter()
70+
.collect::<FuturesUnordered<_>>();
6571

6672
a_tx.send(9).unwrap();
6773
b_tx.send(10).unwrap();
@@ -78,10 +84,12 @@ fn from_iterator() {
7884
let stream = vec![
7985
future::ready::<i32>(1),
8086
future::ready::<i32>(2),
81-
future::ready::<i32>(3)
82-
].into_iter().collect::<FuturesUnordered<_>>();
87+
future::ready::<i32>(3),
88+
]
89+
.into_iter()
90+
.collect::<FuturesUnordered<_>>();
8391
assert_eq!(stream.len(), 3);
84-
assert_eq!(block_on(stream.collect::<Vec<_>>()), vec![1,2,3]);
92+
assert_eq!(block_on(stream.collect::<Vec<_>>()), vec![1, 2, 3]);
8593
}
8694

8795
#[test]
@@ -93,7 +101,9 @@ fn finished_future() {
93101
let mut stream = vec![
94102
Box::new(a_rx) as Box<dyn Future<Output = Result<_, _>> + Unpin>,
95103
Box::new(future::select(b_rx, c_rx).map(|e| e.factor_first().0)) as _,
96-
].into_iter().collect::<FuturesUnordered<_>>();
104+
]
105+
.into_iter()
106+
.collect::<FuturesUnordered<_>>();
97107

98108
let cx = &mut noop_context();
99109
for _ in 0..10 {
@@ -113,7 +123,9 @@ fn iter_mut_cancel() {
113123
let (b_tx, b_rx) = oneshot::channel::<i32>();
114124
let (c_tx, c_rx) = oneshot::channel::<i32>();
115125

116-
let mut stream = vec![a_rx, b_rx, c_rx].into_iter().collect::<FuturesUnordered<_>>();
126+
let mut stream = vec![a_rx, b_rx, c_rx]
127+
.into_iter()
128+
.collect::<FuturesUnordered<_>>();
117129

118130
for rx in stream.iter_mut() {
119131
rx.close();
@@ -134,10 +146,12 @@ fn iter_mut_cancel() {
134146
#[test]
135147
fn iter_mut_len() {
136148
let mut stream = vec![
137-
future::empty::<()>(),
138-
future::empty::<()>(),
139-
future::empty::<()>()
140-
].into_iter().collect::<FuturesUnordered<_>>();
149+
future::pending::<()>(),
150+
future::pending::<()>(),
151+
future::pending::<()>(),
152+
]
153+
.into_iter()
154+
.collect::<FuturesUnordered<_>>();
141155

142156
let mut iter_mut = stream.iter_mut();
143157
assert_eq!(iter_mut.len(), 3);

futures/tests/unfold.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use futures::future;
22
use futures::stream;
33

4+
use futures_test::future::FutureTestExt;
45
use futures_test::{
5-
assert_stream_pending, assert_stream_next, assert_stream_done,
6+
assert_stream_done, assert_stream_next, assert_stream_pending,
67
};
7-
use futures_test::future::FutureTestExt;
88

99
#[test]
1010
fn unfold1() {

0 commit comments

Comments
 (0)