All notable changes to async-std will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
This release improves compile times by up to 55% on initial builds, and up to 75% on recompilation. Additionally we've added a few new APIs and made some tweaks.
TcpListener::into_incoming
to convert aTcpListener
into a stream of incoming TCP connections
- The internal
extension_trait
macro had been removed. This drastically improves compile times forasync-std
, but changes the way our documentation is rendered. This is a cosmetic change only, and all existing code should continue to work as it did before.
- Some internal code has been de-macro-ified, making for quicker compile times.
- We now use the default recursion limit.
- Several docs improvements / fixes.
This release comes with an assortment of small features and fixes.
File
now implementsClone
so thatFile
s can be passed into closures for use inspawn_blocking
.File
's contents are already wrapped inArc
s, so the implementation ofClone
is straightforward.
task::try_current()
which returns a handle to the current task if called within the context of a task created by async-std.async_std::io
now re-exportsWriteExt
directly.
write!
now takes already written bytes into account onFile
.
TcpStream
now properly makes use of vectored IO.- The
net::*::Incoming
implementations now do less allocation.
- Several docs improvements / fixes.
This patch stabilizes the async_std::channel
submodule, removes the
deprecated sync::channel
types, and introduces the tokio1
feature.
As part of our 1.8.0
release last month we introduced the new
async_std::channel
submodule and deprecated the unstable
async_std::sync::channel
types. You can read our full motiviation for this
change in the last patch notes. But the short version is that the old
channels had some fundamental problems, and the sync
submodule is a bit of
a mess.
This release of async-std
promotes async_std::channel
to stable, and
fully removes the async_std::sync::channel
types. In practice many
libraries have already been upgraded to the new channels in the past month,
and this will enable much of the ecosystem to switch off "unstable" versions
of async-std
.
use async_std::channel;
let (sender, receiver) = channel::unbounded();
assert_eq!(sender.send("Hello").await, Ok(()));
assert_eq!(receiver.recv().await, Ok("Hello"));
The Tokio project recently released version 1.0 of their runtime, and the async-std team would like to congratulate the Tokio team on achieving this milestone.
This release of async-std
adds the tokio1
feature flag, enabling Tokio's
TLS constructors to be initialized within the async-std
runtime. This is in
addition to the tokio02
and tokio03
feature flags which we were already
exposing.
In terms of stability it's worth noting that we will continue to provide
support for the tokio02
, tokio03
, and tokio1
on the current major
release line of async-std
. These flags are part of our public API, and
removing compat support for older Tokio versions is considered a breaking
change.
- Removed deprecated
sync::channel
(#933)
- Fixed a typo for [sic]
FuturesExt
trait (#930) - Update the link to
cargo-edit
in the installation section of the docs (#932) - Fixed a small typo for stream (#926)
- Updated
rand
to 0.8 (#923) - Migrated
RwLock
andBarrier
to use theasync-lock
crate internally (#925) - Replaced uses of deprecated the
compare_and_swap
method withcompare_exchange
(#927)
This patch introduces async_std::channel
, a new submodule for our async channels implementation. channels
have been one of async-std's most requested features, and have existed as "unstable" for the past year. We've been cautious about stabilizing channels, and this caution turned out to be warranted: we realized our channels could hang indefinitely under certain circumstances, and people ended up expressing a need for unbounded channels.
So today we're introducing the new async_std::channel
submodule which exports the async-channel
crate, and we're marking the older unstable async_std::sync::channel
API as "deprecated". This release includes both APIs, but we intend to stabilize async_std::channel
and remove the older API in January. This should give dependent projects a month to upgrade, though we can extend that if it proves to be too short.
The rationale for adding a new top-level channel
submodule, rather than extending sync
is that the std::sync
and async_std::sync
submodule are a bit of a mess, and the libs team has been talking about splitting std::sync
up into separate modules. The stdlib has to guarantee it'll forever be backwards compatible, but async-std
does not (we fully expect a 2.0 once we have async closures & traits). So we're experimenting with this change before std
does, with the expectation that this change can serve as a data point when the libs team decides how to proceed in std.
async_std::channel
as "unstable" #915async_std::process
as "unstable" #916
- Fixed mentions of the
tokio03
flags in the docs #909 - Fixed a double drop issue in
StreamExt::cycle
#903
- updated
pin-project
tov0.2.0
1.7.0 - 2020-10-30
This patch adds a feature to enable compatibility with the new tokio
0.3.0
release, and updates internal dependencies.
- Add
tokio03
feature (#895)
- chore: update dependencies (#897)
1.6.5 - 2020-09-28
1.6.4 - 2020-09-16
- Added
UdpSocket::peek
andUdpSocket::peek_from
(#853)
-
Extracted the executor into async-global-executor (#867)
-
Updated various dependencies
- Ensure
UnixStream::into_raw_fd
doesn't close the file descriptor (#855) - Fixed wasm builds and ensured better dependency management depending on the compile target (#863)
1.6.3 - 2020-07-31
- Switched from smol to individual executor parts. (#836)
- Replaced internal
Mutex
implementation withasync-mutex
. (#822)
- Added missing
Send
guards toStream::collect
. (#665)
1.6.2 - 2020-06-19
- Add
UdpSocket::peer_addr
(#816)
- Ensure the reactor is running for sockets and timers (#819).
- Avoid excessive polling in
flatten
andflat_map
(#701)
1.6.1 - 2020-06-11
- Added
tokio02
feature flag, to allow compatability usage with tokio@0.2 (#804).
- Removed unstable
stdio
lock methods, due to their unsoundness (#807).
- Fixed wrong slice index for file reading (#802).
- Fixed recursive calls to
block_on
(#799) and (#809). - Remove
default
feature requirement for theunstable
feature (#806).
1.6.0 - 2020-05-22
See 1.6.0-beta.1
and 1.6.0-beta.2
.
1.6.0-beta.2 - 2020-05-19
- Added an environment variable to configure the thread pool size of the runtime. (#774)
- Implement
Clone
forUnixStream
(#772)
- For
wasm
, switched underlyingTimer
implementation tofutures-timer
. (#776)
- Use
smol::block_on
to handle drop ofFile
, avoiding nested executor panic. (#768)
1.6.0-beta.1 - 2020-05-07
- Added
task::spawn_local
. (#757) - Added out of the box support for
wasm
. (#757) - Added
JoinHandle::cancel
(#757) - Added
sync::Condvar
(#369) - Added
sync::Sender::try_send
andsync::Receiver::try_recv
(#585) - Added
no_std
support fortask
,future
andstream
(#680)
- Switched underlying runtime to
smol
. (#757) - Switched implementation of
sync::Barrier
to usesync::Condvar
likestd
does. (#581)
- Allow compilation on 32 bit targets, by using
AtomicUsize
forTaskId
. (#756)
1.5.0 - 2020-02-03
This patch includes various quality of life improvements to async-std.
Including improved performance, stability, and the addition of various
Clone
impls that replace the use of Arc
in many cases.
- Added links to various ecosystem projects from the README (#660)
- Added an example on
FromStream
forResult<T, E>
(#643) - Added
stream::pending
as "unstable" (#615) - Added an example of
stream::timeout
to document the error flow (#675) - Implement
Clone
forDirEntry
(#682) - Implement
Clone
forTcpStream
(#689)
- Removed internal comment on
stream::Interval
(#645) - The "unstable" feature can now be used without requiring the "default" feature (#647)
- Removed unnecessary trait bound on
stream::FlatMap
(#651) - Updated the "broadcaster" dependency used by "unstable" to
1.0.0
(#681) - Updated
async-task
to 1.2.1 (#676) task::block_on
now parks after a single poll, improving performance in many cases (#684)- Improved reading flow of the "client" part of the async-std tutorial (#550)
- Use
take_while
instead ofscan
inimpl
ofProduct
,Sum
andFromStream
(#667) TcpStream::connect
no longer uses a thread from the threadpool, improving performance (#687)
- Fixed crate documentation typo (#655)
- Fixed documentation for
UdpSocket::recv
(#648) - Fixed documentation for
UdpSocket::send
(#671) - Fixed typo in stream documentation (#650)
- Fixed typo on
sync::JoinHandle
documentation (#659) - Removed use of
std::error::Error::description
which failed CI (#661) - Removed the use of rustfmt's unstable
format_code_in_doc_comments
option which failed CI (#685) - Fixed a code typo in the
task::sleep
example (#688)
1.4.0 - 2019-12-20
This patch adds Future::timeout
, providing a method counterpart to the
future::timeout
free function. And includes several bug fixes around missing
APIs. Notably we're not shipping our new executor yet, first announced on our
blog.
use async_std::prelude::*;
use async_std::future;
use std::time::Duration;
let fut = future::pending::<()>(); // This future will never resolve.
let res = fut.timeout(Duration::from_millis(100)).await;
assert!(res.is_err()); // The future timed out, returning an err.
- Added
Future::timeout
as "unstable" (#600)
- Fixed a doc test and enabled it on CI (#597)
- Fixed a rendering issue with the
stream
submodule documentation (#621) Write::write_fmt
's future is now correctly marked as#[must_use]
(#628)- Fixed the missing
io::Bytes
export (#633) - Fixed the missing
io::Chain
export (#633) - Fixed the missing
io::Take
export (#633)
1.3.0 - 2019-12-12
This patch introduces Stream::delay
, more methods on DoubleEndedStream
,
and improves compile times. Stream::delay
is a new API that's similar to
task::sleep
,
but can be passed as part of as stream, rather than as a separate block. This is
useful for examples, or when manually debugging race conditions.
let start = Instant::now();
let mut s = stream::from_iter(vec![0u8, 1]).delay(Duration::from_millis(200));
// The first time will take more than 200ms due to delay.
s.next().await;
assert!(start.elapsed().as_millis() >= 200);
// There will be no delay after the first time.
s.next().await;
assert!(start.elapsed().as_millis() <= 210);
- Added
Stream::delay
as "unstable" (#309) - Added
DoubleEndedStream::next_back
as "unstable" (#562) - Added
DoubleEndedStream::nth_back
as "unstable" (#562) - Added
DoubleEndedStream::rfind
as "unstable" (#562) - Added
DoubleEndedStream::rfold
as "unstable" (#562) - Added
DoubleEndedStream::try_rfold
as "unstable" (#562) stream::Once
now implementsDoubleEndedStream
(#562)stream::FromIter
now implementsDoubleEndedStream
(#562)
- Removed our dependency on
async-macros
, speeding up compilation (#610)
- Fixed a link in the task docs (#598)
- Fixed the
UdpSocket::recv
example (#603) - Fixed a link to
task::block_on
(#608) - Fixed an incorrect API mention in
task::Builder
(#612) - Fixed leftover mentions of
futures-preview
(#595) - Fixed a typo in the tutorial (#614)
<TcpStream as Write>::poll_close
now closes the write half of the stream (#618)
1.2.0 - 2019-11-27
This patch includes some minor quality-of-life improvements, introduces a
new Stream::unzip
API, and adds verbose errors to our networking types.
This means if you can't connect to a socket, you'll never have to wonder again which address it was you couldn't connect to, instead of having to go through the motions to debug what the address was.
Unzip a stream of tuples into two collections:
use async_std::prelude::*;
use async_std::stream;
let s = stream::from_iter(vec![(1,2), (3,4)]);
let (left, right): (Vec<_>, Vec<_>) = s.unzip().await;
assert_eq!(left, [1, 3]);
assert_eq!(right, [2, 4]);
- Added
Stream::unzip
as "unstable". - Added verbose errors to the networking types.
- Enabled CI on master branch.
Future::join
andFuture::try_join
can now join futures with different output types.
- Fixed the docs and
Debug
output ofBufWriter
. - Fixed a bug in
Stream::throttle
that made it consume too much CPU.
1.1.0 - 2019-11-21
This patch introduces a faster scheduler algorithm, Stream::throttle
, and
stabilizes task::yield_now
. Additionally we're introducing several more stream
APIs, bringing us to almost complete parity with the standard library.
Furthermore our path
submodule now returns more context in errors. So if
opening a file fails, async-std will tell you which file was failed to open,
making it easier to write and debug programs.
let start = Instant::now();
let mut s = stream::interval(Duration::from_millis(5))
.throttle(Duration::from_millis(10))
.take(2);
s.next().await;
assert!(start.elapsed().as_millis() >= 5);
s.next().await;
assert!(start.elapsed().as_millis() >= 15);
s.next().await;
assert!(start.elapsed().as_millis() >= 25);
- Added
Stream::throttle
as "unstable". - Added
Stream::count
as "unstable". - Added
Stream::max
as "unstable". - Added
Stream::successors
as "unstable". - Added
Stream::by_ref
as "unstable". - Added
Stream::partition
as "unstable". - Added contextual errors to the
path
submodule. - Added
os::windows::symlink_dir
as "unstable". - Added
os::windows::symlink_file
as "unstable". - Stabilized
task::yield_now
.
- We now ignore seek errors when rolling back failed
read
calls onFile
. - Fixed a bug where
Stream::max_by_key
was returning the wrong result. - Fixed a bug where
Stream::min_by_key
was returning the wrong result.
- Applied various fixes to the tutorial.
- Fixed an issue with Clippy.
- Optimized an internal code generation macro, improving compilation speeds.
- Removed an
Unpin
bound fromstream::Once
. - Removed various extra internal uses of
pin_mut!
. - Simplified
Stream::any
andStream::all
's internals. - The
surf
example is now enabled again. - Tweaked some streams internals.
- Updated
futures-timer
to 2.0.0, improving compilation speed. - Upgraded
async-macros
to 2.0.0. Stream::merge
now uses randomized ordering to reduce overall latency.- The scheduler is now more efficient by keeping a slot for the next task to run. This is similar to Go's scheduler, and Tokio's scheduler.
- Fixed the documentation of the
channel
types to link back to thechannel
function.
1.0.1 - 2019-11-12
We were seeing a regression in our fs performance, caused by too many long-running tasks. This patch fixes that regression by being more proactive about closing down idle threads.
- Improved thread startup/shutdown algorithm in
task::spawn_blocking
. - Fixed a typo in the tutorial.
1.0.0 - 2019-11-11
This release marks the 1.0.0
release of async-std; a major milestone for our
development. This release itself mostly includes quality of life improvements
for all of modules, including more consistent API bounds for a lot of our
submodules.
The biggest change is that we're now using the full semver range,
major.minor.patch
, and any breaking changes to our "stable" APIs will require
an update of the major
number.
We're excited we've hit this milestone together with you all. Thank you!
- Added
Future::join
as "unstable", replacingfuture::join!
. - Added
Future::try_join
as "unstable", replacingfuture::try_join!
. - Enabled
stable
andbeta
channel testing on CI. - Implemented
FromIterator
andExtend
forPathBuf
. - Implemented
FromStream
forPathBuf
. - Loosened the trait bounds of
io::copy
on "unstable".
- Added a
Sync
bound toRwLock
, resolving a memory safety issue. - Fixed a bug in
Stream::take_while
where it could continue after it should've ended. - Fixed a bug where our
attributes
Cargo feature wasn't working as intended. - Improved documentation of
Stream::merge
, documenting ordering guarantees. - Update doc imports in examples to prefer async-std's types.
- Various quality of life improvements to the
future
submodule. - Various quality of life improvements to the
path
submodule. - Various quality of life improvements to the
stream
submodule.
- Removed
future::join!
in favor ofFuture::join
. - Removed
future::try_join!
in favor ofFuture::try_join
.
0.99.12 - 2019-11-07
This patch upgrades us to futures
0.3, support for async/await
on Rust
Stable, performance improvements, and brand new module-level documentation.
- Added
Future::flatten
as "unstable". - Added
Future::race
as "unstable" (replacesfuture::select!
). - Added
Future::try_race
as "unstable" (replacesfuture::try_select!
). - Added
Stderr::lock
as "unstable". - Added
Stdin::lock
as "unstable". - Added
Stdout::lock
as "unstable". - Added
Stream::copied
as "unstable". - Added
Stream::eq
as "unstable". - Added
Stream::max_by_key
as "unstable". - Added
Stream::min
as "unstable". - Added
Stream::ne
as "unstable". - Added
Stream::position
as "unstable". - Added
StreamExt
andFutureExt
as enumerable in theprelude
. - Added
TcpListener
andTcpStream
integration tests. - Added
stream::from_iter
. - Added
sync::WakerSet
for internal use. - Added an example to handle both
IP v4
andIP v6
connections. - Added the
default
Cargo feature. - Added the
attributes
Cargo feature. - Added the
std
Cargo feature.
- Fixed a bug in the blocking threadpool where it didn't spawn more than one thread.
- Fixed a bug with
Stream::merge
where sometimes it ended too soon. - Fixed a bug with our GitHub actions setup.
- Fixed an issue where our channels could spuriously deadlock.
- Refactored the
task
module. - Removed a deprecated GitHub action.
- Replaced
futures-preview
withfutures
. - Replaced
lazy_static
withonce_cell
. - Replaced all uses of
VecDequeue
in the examples withstream::from_iter
. - Simplified
sync::RwLock
using the internalsync::WakerSet
type. - Updated the
path
submodule documentation to match std. - Updated the mod-level documentation to match std.
- Removed
future::select!
(replaced byFuture::race
). - Removed
future::try_select!
(replaced byFuture::try_race
).
0.99.11 - 2019-10-29
This patch introduces async_std::sync::channel
, a novel asynchronous port of
the ultra-fast Crossbeam channels. This has been one of the most anticipated
features for async-std, and we're excited to be providing a first version of
this!
In addition to channels, this patch has the regular list of new methods, types, and doc fixes.
Send and receive items from a channel
// Create a bounded channel with a max-size of 1
let (s, r) = channel(1);
// This call returns immediately because there is enough space in the channel.
s.send(1).await;
task::spawn(async move {
// This call blocks the current task because the channel is full.
// It will be able to complete only after the first message is received.
s.send(2).await;
});
// Receive items from the channel
task::sleep(Duration::from_secs(1)).await;
assert_eq!(r.recv().await, Some(1));
assert_eq!(r.recv().await, Some(2));
- Added
Future::delay
as "unstable" - Added
Stream::flat_map
as "unstable" - Added
Stream::flatten
as "unstable" - Added
Stream::product
as "unstable" - Added
Stream::sum
as "unstable" - Added
Stream::min_by_key
- Added
Stream::max_by
- Added
Stream::timeout
as "unstable" - Added
sync::channel
as "unstable". - Added doc links from instantiated structs to the methods that create them.
- Implemented
Extend
+FromStream
forPathBuf
.
- Fixed an issue with
block_on
so it works even when nested. - Fixed issues with our Clippy check on CI.
- Replaced our uses of
cfg_if
with our own macros, simplifying the codebase. - Updated the homepage link in
Cargo.toml
to point to async.rs. - Updated the module-level documentation for
stream
andsync
. - Various typos and grammar fixes.
- Removed redundant file flushes, improving the performance of
File
operations
Nothing was removed in this release.
0.99.10 - 2019-10-16
This patch stabilizes several core concurrency macros, introduces async versions
of Path
and PathBuf
, and adds almost 100 other commits.
Asynchronously read directories from the filesystem
use async_std::fs;
use async_std::path::Path;
use async_std::prelude::*;
let path = Path::new("/laputa");
let mut dir = fs::read_dir(&path).await.unwrap();
while let Some(entry) = dir.next().await {
if let Ok(entry) = entry {
println!("{:?}", entry.path());
}
}
Cooperatively reschedule the current task on the executor
use async_std::prelude::*;
use async_std::task;
task::spawn(async {
let x = fibonnacci(1000); // Do expensive work
task::yield_now().await; // Allow other tasks to run
x + fibonnacci(100) // Do more work
})
Create an interval stream
use async_std::prelude::*;
use async_std::stream;
use std::time::Duration;
let mut interval = stream::interval(Duration::from_secs(4));
while let Some(_) = interval.next().await {
println!("prints every four seconds");
}
- Added
FutureExt
to theprelude
, allowing us to extendFuture
- Added
Stream::cmp
- Added
Stream::ge
- Added
Stream::last
- Added
Stream::le
- Added
Stream::lt
- Added
Stream::merge
as "unstable", replacingstream::join!
- Added
Stream::partial_cmp
- Added
Stream::take_while
- Added
Stream::try_fold
- Added
future::IntoFuture
as "unstable" - Added
io::BufRead::split
- Added
io::Write::write_fmt
- Added
print!
,println!
,eprint!
,eprintln!
macros as "unstable" - Added
process
as "unstable", re-exporting std types only for now - Added
std::net
re-exports to thenet
submodule - Added
std::path::PathBuf
with all associated methods - Added
std::path::Path
with all associated methods - Added
stream::ExactSizeStream
as "unstable" - Added
stream::FusedStream
as "unstable" - Added
stream::Product
- Added
stream::Sum
- Added
stream::from_fn
- Added
stream::interval
as "unstable" - Added
stream::repeat_with
- Added
task::spawn_blocking
as "unstable", replacingtask::blocking
- Added
task::yield_now
- Added
write!
andwriteln!
macros as "unstable" - Stabilized
future::join!
andfuture::try_join!
- Stabilized
future::timeout
- Stabilized
path
- Stabilized
task::ready!
- Fixed
BufWriter::into_inner
so it callsflush
before yielding - Refactored
io::BufWriter
internals - Refactored
net::ToSocketAddrs
internals - Removed Travis CI entirely
- Rewrote the README.md
- Stabilized
io::Cursor
- Switched bors over to use GitHub actions
- Updated the
io
documentation to match std'sio
docs - Updated the
task
documentation to match std'sthread
docs
- Removed the "unstable"
stream::join!
in favor ofStream::merge
- Removed the "unstable"
task::blocking
in favor oftask::spawn_blocking
0.99.9 - 2019-10-08
This patch upgrades our futures-rs
version, allowing us to build on the 1.39
beta. Additionally we've introduced map
and for_each
to Stream
. And we've
added about a dozen new FromStream
implementations for std
types, bringing
us up to par with std's FromIterator
implementations.
And finally we've added a new "unstable" task::blocking
function which can be
used to convert blocking code into async code using a threadpool. We've been
using this internally for a while now to async-std to power our fs
and
net::SocketAddr
implementations. With this patch userland code now finally has
access to this too.
Create a stream of tuples, and collect into a hashmap
let a = stream::once(1u8);
let b = stream::once(0u8);
let s = a.zip(b);
let map: HashMap<u8, u8> = s.collect().await;
assert_eq!(map.get(&1), Some(&0u8));
Spawn a blocking task on a dedicated threadpool
task::blocking(async {
println!("long-running task here");
}).await;
- Added
stream::Stream::map
- Added
stream::Stream::for_each
- Added
stream::Stream::try_for_each
- Added
task::blocking
as "unstable" - Added
FromStream
for allstd::{option, collections, result, string, sync}
types. - Added the
path
submodule as "unstable".
- Updated
futures-preview
to0.3.0-alpha.19
, allowing us to build onrustc 1.39.0-beta
. - As a consequence of this upgrade, all of our concrete stream implementations
now make use of
Stream::size_hint
to optimize internal allocations. - We now use GitHub Actions through actions-rs, in addition to Travis CI. We intend to fully switch in the near future.
- Fixed a bug introduced in 0.99.6 where Unix Domain Listeners would sometimes become unresponsive.
- Updated our
sync::Barrier
docs to match std. - Updated our
stream::FromStream
docs to match std'sFromIterator
.
0.99.8 - 2019-09-28
- Added README to examples directory.
- Added concurrency documentation to the futures submodule.
- Added
io::Read::take
method. - Added
io::Read::by_ref
method. - Added
io::Read::chain
method.
- Pin futures-preview to
0.3.0-alpha.18
, to avoid rustc upgrade problems. - Simplified extension traits using a macro.
- Use the
broadcast
module withstd::sync::Mutex
, reducing dependencies.
0.99.7 - 2019-09-26
- Added
future::join
macro as "unstable" - Added
future::select
macro as "unstable" - Added
future::try_join
macro as "unstable" - Added
future::try_select
macro as "unstable" - Added
io::BufWriter
struct - Added
stream::Extend
trait - Added
stream::Stream::chain
method - Added
stream::Stream::filter
method - Added
stream::Stream::inspect
method - Added
stream::Stream::skip_while
method - Added
stream::Stream::skip
method - Added
stream::Stream::step_by
method - Added
sync::Arc
struct from stdlib - Added
sync::Barrier
struct as "unstable" - Added
sync::Weak
struct from stdlib - Added
task::ready
macro as "unstable"
- Correctly marked the
pin
submodule as "unstable" in the docs - Updated tutorial to have certain functions suffixed with
_loop
io
traits are now re-exports of futures-rs types, allowing them to be implementedstream
traits are now re-exports of futures-rs types, allowing them to be implementedprelude::*
now needs to be in scope for functionsio
andstream
traits to work
0.99.6 - 2019-09-19
- Added
stream::Stream::collect
as "unstable" - Added
stream::Stream::enumerate
- Added
stream::Stream::fuse
- Added
stream::Stream::fold
- Added
stream::Stream::scan
- Added
stream::Stream::zip
- Added
stream::join
macro as "unstable" - Added
stream::DoubleEndedStream
as "unstable" - Added
stream::FromStream
trait as "unstable" - Added
stream::IntoStream
trait as "unstable" - Added
io::Cursor
as "unstable" - Added
io::BufRead::consume
method - Added
io::repeat
- Added
io::Slice
andio::SliceMut
- Added documentation for feature flags
- Added
pin
submodule as "unstable" - Added the ability to
collect
a stream ofResult<T, E>
s into aResult<impl FromStream<T>, E>
- Refactored the scheduling algorithm of our executor to use work stealing
- Refactored the network driver, removing 400 lines of code
- Removed the
Send
bound fromtask::block_on
- Removed
Unpin
bound fromimpl<T: futures::stream::Stream> Stream for T
0.99.5 - 2019-09-12
- Added tests for
io::timeout
- Added
io::BufRead::fill_buf
, anasync fn
counterpart topoll_fill_buf
- Added
fs::create_dir_all
- Added
future::timeout
, a free function to time out futures after a threshold - Added
io::prelude
- Added
net::ToSocketAddrs
, a non-blocking version of std'sToSocketAddrs
- Added
stream::Stream::all
- Added
stream::Stream::filter_map
- Added
stream::Stream::find_map
- Added
stream::Stream::find
- Added
stream::Stream::min_by
- Added
stream::Stream::nth
- Polished the text and examples of the tutorial
cargo fmt
on all examples- Simplified internals of
TcpStream::connect_to
- Modularized our CI setup, enabled a rustfmt fallback, and improved caching
- Reduced our dependency on the
futures-rs
crate, improving compilation times - Split
io::Read
,io::Write
,io::BufRead
, andstream::Stream
into multiple files fs::File
now flushes more often to prevent flushes duringseek
- Updated all dependencies
- Fixed a bug in the conversion of
File
into raw handle - Fixed compilation errors on the latest nightly
0.99.4 - 2019-08-21
- Many small changes in the book, mostly typos
- Documentation fixes correcting examples
- Now works with recent nightly with stabilised async/await (> 2019-08-21)
0.99.3 - 2019-08-16
- Initial beta release