diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /third_party/rust/futures-0.1.31/src/stream/chain.rs | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/futures-0.1.31/src/stream/chain.rs')
-rw-r--r-- | third_party/rust/futures-0.1.31/src/stream/chain.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/third_party/rust/futures-0.1.31/src/stream/chain.rs b/third_party/rust/futures-0.1.31/src/stream/chain.rs new file mode 100644 index 0000000000..0ff0e5ce6f --- /dev/null +++ b/third_party/rust/futures-0.1.31/src/stream/chain.rs @@ -0,0 +1,57 @@ +use core::mem; + +use stream::Stream; +use {Async, Poll}; + + +/// State of chain stream. +#[derive(Debug)] +enum State<S1, S2> { + /// Emitting elements of first stream + First(S1, S2), + /// Emitting elements of second stream + Second(S2), + /// Temporary value to replace first with second + Temp, +} + +/// An adapter for chaining the output of two streams. +/// +/// The resulting stream produces items from first stream and then +/// from second stream. +#[derive(Debug)] +#[must_use = "streams do nothing unless polled"] +pub struct Chain<S1, S2> { + state: State<S1, S2> +} + +pub fn new<S1, S2>(s1: S1, s2: S2) -> Chain<S1, S2> + where S1: Stream, S2: Stream<Item=S1::Item, Error=S1::Error>, +{ + Chain { state: State::First(s1, s2) } +} + +impl<S1, S2> Stream for Chain<S1, S2> + where S1: Stream, S2: Stream<Item=S1::Item, Error=S1::Error>, +{ + type Item = S1::Item; + type Error = S1::Error; + + fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> { + loop { + match self.state { + State::First(ref mut s1, ref _s2) => match s1.poll() { + Ok(Async::Ready(None)) => (), // roll + x => return x, + }, + State::Second(ref mut s2) => return s2.poll(), + State::Temp => unreachable!(), + } + + self.state = match mem::replace(&mut self.state, State::Temp) { + State::First(_s1, s2) => State::Second(s2), + _ => unreachable!(), + }; + } + } +} |