summaryrefslogtreecommitdiffstats
path: root/third_party/rust/futures-0.1.31/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/futures-0.1.31/src/lib.rs')
-rw-r--r--third_party/rust/futures-0.1.31/src/lib.rs266
1 files changed, 266 insertions, 0 deletions
diff --git a/third_party/rust/futures-0.1.31/src/lib.rs b/third_party/rust/futures-0.1.31/src/lib.rs
new file mode 100644
index 0000000000..ccadb6777f
--- /dev/null
+++ b/third_party/rust/futures-0.1.31/src/lib.rs
@@ -0,0 +1,266 @@
+//! Zero-cost Futures in Rust
+//!
+//! This library is an implementation of futures in Rust which aims to provide
+//! a robust implementation of handling asynchronous computations, ergonomic
+//! composition and usage, and zero-cost abstractions over what would otherwise
+//! be written by hand.
+//!
+//! Futures are a concept for an object which is a proxy for another value that
+//! may not be ready yet. For example issuing an HTTP request may return a
+//! future for the HTTP response, as it probably hasn't arrived yet. With an
+//! object representing a value that will eventually be available, futures allow
+//! for powerful composition of tasks through basic combinators that can perform
+//! operations like chaining computations, changing the types of futures, or
+//! waiting for two futures to complete at the same time.
+//!
+//! You can find extensive tutorials and documentations at [https://tokio.rs]
+//! for both this crate (asynchronous programming in general) as well as the
+//! Tokio stack to perform async I/O with.
+//!
+//! [https://tokio.rs]: https://tokio.rs
+//!
+//! ## Installation
+//!
+//! Add this to your `Cargo.toml`:
+//!
+//! ```toml
+//! [dependencies]
+//! futures = "0.1"
+//! ```
+//!
+//! ## Examples
+//!
+//! Let's take a look at a few examples of how futures might be used:
+//!
+//! ```
+//! extern crate futures;
+//!
+//! use std::io;
+//! use std::time::Duration;
+//! use futures::prelude::*;
+//! use futures::future::Map;
+//!
+//! // A future is actually a trait implementation, so we can generically take a
+//! // future of any integer and return back a future that will resolve to that
+//! // value plus 10 more.
+//! //
+//! // Note here that like iterators, we're returning the `Map` combinator in
+//! // the futures crate, not a boxed abstraction. This is a zero-cost
+//! // construction of a future.
+//! fn add_ten<F>(future: F) -> Map<F, fn(i32) -> i32>
+//! where F: Future<Item=i32>,
+//! {
+//! fn add(a: i32) -> i32 { a + 10 }
+//! future.map(add)
+//! }
+//!
+//! // Not only can we modify one future, but we can even compose them together!
+//! // Here we have a function which takes two futures as input, and returns a
+//! // future that will calculate the sum of their two values.
+//! //
+//! // Above we saw a direct return value of the `Map` combinator, but
+//! // performance isn't always critical and sometimes it's more ergonomic to
+//! // return a trait object like we do here. Note though that there's only one
+//! // allocation here, not any for the intermediate futures.
+//! fn add<'a, A, B>(a: A, b: B) -> Box<Future<Item=i32, Error=A::Error> + 'a>
+//! where A: Future<Item=i32> + 'a,
+//! B: Future<Item=i32, Error=A::Error> + 'a,
+//! {
+//! Box::new(a.join(b).map(|(a, b)| a + b))
+//! }
+//!
+//! // Futures also allow chaining computations together, starting another after
+//! // the previous finishes. Here we wait for the first computation to finish,
+//! // and then decide what to do depending on the result.
+//! fn download_timeout(url: &str,
+//! timeout_dur: Duration)
+//! -> Box<Future<Item=Vec<u8>, Error=io::Error>> {
+//! use std::io;
+//! use std::net::{SocketAddr, TcpStream};
+//!
+//! type IoFuture<T> = Box<Future<Item=T, Error=io::Error>>;
+//!
+//! // First thing to do is we need to resolve our URL to an address. This
+//! // will likely perform a DNS lookup which may take some time.
+//! let addr = resolve(url);
+//!
+//! // After we acquire the address, we next want to open up a TCP
+//! // connection.
+//! let tcp = addr.and_then(|addr| connect(&addr));
+//!
+//! // After the TCP connection is established and ready to go, we're off to
+//! // the races!
+//! let data = tcp.and_then(|conn| download(conn));
+//!
+//! // That all might take awhile, though, so let's not wait too long for it
+//! // to all come back. The `select` combinator here returns a future which
+//! // resolves to the first value that's ready plus the next future.
+//! //
+//! // Note we can also use the `then` combinator which is similar to
+//! // `and_then` above except that it receives the result of the
+//! // computation, not just the successful value.
+//! //
+//! // Again note that all the above calls to `and_then` and the below calls
+//! // to `map` and such require no allocations. We only ever allocate once
+//! // we hit the `Box::new()` call at the end here, which means we've built
+//! // up a relatively involved computation with only one box, and even that
+//! // was optional!
+//!
+//! let data = data.map(Ok);
+//! let timeout = timeout(timeout_dur).map(Err);
+//!
+//! let ret = data.select(timeout).then(|result| {
+//! match result {
+//! // One future succeeded, and it was the one which was
+//! // downloading data from the connection.
+//! Ok((Ok(data), _other_future)) => Ok(data),
+//!
+//! // The timeout fired, and otherwise no error was found, so
+//! // we translate this to an error.
+//! Ok((Err(_timeout), _other_future)) => {
+//! Err(io::Error::new(io::ErrorKind::Other, "timeout"))
+//! }
+//!
+//! // A normal I/O error happened, so we pass that on through.
+//! Err((e, _other_future)) => Err(e),
+//! }
+//! });
+//! return Box::new(ret);
+//!
+//! fn resolve(url: &str) -> IoFuture<SocketAddr> {
+//! // ...
+//! # panic!("unimplemented");
+//! }
+//!
+//! fn connect(hostname: &SocketAddr) -> IoFuture<TcpStream> {
+//! // ...
+//! # panic!("unimplemented");
+//! }
+//!
+//! fn download(stream: TcpStream) -> IoFuture<Vec<u8>> {
+//! // ...
+//! # panic!("unimplemented");
+//! }
+//!
+//! fn timeout(stream: Duration) -> IoFuture<()> {
+//! // ...
+//! # panic!("unimplemented");
+//! }
+//! }
+//! # fn main() {}
+//! ```
+//!
+//! Some more information can also be found in the [README] for now, but
+//! otherwise feel free to jump in to the docs below!
+//!
+//! [README]: https://github.com/rust-lang-nursery/futures-rs#futures-rs
+
+#![no_std]
+#![deny(missing_docs, missing_debug_implementations)]
+#![allow(bare_trait_objects, unknown_lints)]
+#![doc(html_root_url = "https://docs.rs/futures/0.1")]
+
+#[macro_use]
+#[cfg(feature = "use_std")]
+extern crate std;
+
+macro_rules! if_std {
+ ($($i:item)*) => ($(
+ #[cfg(feature = "use_std")]
+ $i
+ )*)
+}
+
+#[macro_use]
+mod poll;
+pub use poll::{Poll, Async, AsyncSink, StartSend};
+
+pub mod future;
+pub use future::{Future, IntoFuture};
+
+pub mod stream;
+pub use stream::Stream;
+
+pub mod sink;
+pub use sink::Sink;
+
+#[deprecated(since = "0.1.4", note = "import through the future module instead")]
+#[cfg(feature = "with-deprecated")]
+#[doc(hidden)]
+pub use future::{done, empty, failed, finished, lazy};
+
+#[doc(hidden)]
+#[cfg(feature = "with-deprecated")]
+#[deprecated(since = "0.1.4", note = "import through the future module instead")]
+pub use future::{
+ Done, Empty, Failed, Finished, Lazy, AndThen, Flatten, FlattenStream, Fuse, IntoStream,
+ Join, Join3, Join4, Join5, Map, MapErr, OrElse, Select,
+ SelectNext, Then
+};
+
+#[cfg(feature = "use_std")]
+mod lock;
+mod task_impl;
+
+mod resultstream;
+
+pub mod task;
+pub mod executor;
+#[cfg(feature = "use_std")]
+pub mod sync;
+#[cfg(feature = "use_std")]
+pub mod unsync;
+
+
+if_std! {
+ #[doc(hidden)]
+ #[deprecated(since = "0.1.4", note = "use sync::oneshot::channel instead")]
+ #[cfg(feature = "with-deprecated")]
+ pub use sync::oneshot::channel as oneshot;
+
+ #[doc(hidden)]
+ #[deprecated(since = "0.1.4", note = "use sync::oneshot::Receiver instead")]
+ #[cfg(feature = "with-deprecated")]
+ pub use sync::oneshot::Receiver as Oneshot;
+
+ #[doc(hidden)]
+ #[deprecated(since = "0.1.4", note = "use sync::oneshot::Sender instead")]
+ #[cfg(feature = "with-deprecated")]
+ pub use sync::oneshot::Sender as Complete;
+
+ #[doc(hidden)]
+ #[deprecated(since = "0.1.4", note = "use sync::oneshot::Canceled instead")]
+ #[cfg(feature = "with-deprecated")]
+ pub use sync::oneshot::Canceled;
+
+ #[doc(hidden)]
+ #[deprecated(since = "0.1.4", note = "import through the future module instead")]
+ #[cfg(feature = "with-deprecated")]
+ #[allow(deprecated)]
+ pub use future::{BoxFuture, collect, select_all, select_ok};
+
+ #[doc(hidden)]
+ #[deprecated(since = "0.1.4", note = "import through the future module instead")]
+ #[cfg(feature = "with-deprecated")]
+ pub use future::{SelectAll, SelectAllNext, Collect, SelectOk};
+}
+
+/// A "prelude" for crates using the `futures` crate.
+///
+/// This prelude is similar to the standard library's prelude in that you'll
+/// almost always want to import its entire contents, but unlike the standard
+/// library's prelude you'll have to do so manually. An example of using this is:
+///
+/// ```
+/// use futures::prelude::*;
+/// ```
+///
+/// We may add items to this over time as they become ubiquitous as well, but
+/// otherwise this should help cut down on futures-related imports when you're
+/// working with the `futures` crate!
+pub mod prelude {
+ #[doc(no_inline)]
+ pub use {Future, Stream, Sink, Async, AsyncSink, Poll, StartSend};
+ #[doc(no_inline)]
+ pub use IntoFuture;
+}