forked from rust-lang/futures-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add the SinkExt::feed combinator (rust-lang#2155)
Like send, except no flushing is done at the end. This allows sequentially feeding the sink with items in async code without intermittent flushing. Reuse code of Feed internally in the Send future.
- Loading branch information
Showing
4 changed files
with
70 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
use core::pin::Pin; | ||
use futures_core::future::Future; | ||
use futures_core::ready; | ||
use futures_core::task::{Context, Poll}; | ||
use futures_sink::Sink; | ||
|
||
/// Future for the [`feed`](super::SinkExt::feed) method. | ||
#[derive(Debug)] | ||
#[must_use = "futures do nothing unless you `.await` or poll them"] | ||
pub struct Feed<'a, Si: ?Sized, Item> { | ||
sink: &'a mut Si, | ||
item: Option<Item>, | ||
} | ||
|
||
// Pinning is never projected to children | ||
impl<Si: Unpin + ?Sized, Item> Unpin for Feed<'_, Si, Item> {} | ||
|
||
impl<'a, Si: Sink<Item> + Unpin + ?Sized, Item> Feed<'a, Si, Item> { | ||
pub(super) fn new(sink: &'a mut Si, item: Item) -> Self { | ||
Feed { sink, item: Some(item) } | ||
} | ||
|
||
pub(super) fn sink_pin_mut(&mut self) -> Pin<&mut Si> { | ||
Pin::new(self.sink) | ||
} | ||
|
||
pub(super) fn is_item_pending(&self) -> bool { | ||
self.item.is_some() | ||
} | ||
} | ||
|
||
impl<Si: Sink<Item> + Unpin + ?Sized, Item> Future for Feed<'_, Si, Item> { | ||
type Output = Result<(), Si::Error>; | ||
|
||
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { | ||
let this = self.get_mut(); | ||
let mut sink = Pin::new(&mut this.sink); | ||
ready!(sink.as_mut().poll_ready(cx))?; | ||
let item = this.item.take().expect("polled Feed after completion"); | ||
sink.as_mut().start_send(item)?; | ||
Poll::Ready(Ok(())) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters