Crates.io | gen-z |
lib.rs | gen-z |
version | 0.1.0 |
source | src |
created_at | 2020-10-23 00:34:31.234282 |
updated_at | 2020-10-23 00:34:31.234282 |
description | Macro-free stream construction through asynchronous generators via an awaitable sender |
homepage | |
repository | https://github.com/Dessix/gen-z-rs |
max_upload_size | |
id | 304505 |
size | 16,914 |
Generators are still unstable, and generating streams requires complicated ownership handling, so this crate aims to enable ad-hoc generation of streams.
Current async implementations attempt to provide yield
syntax via macros,
but this is not transparent to IDEs at the time of this library's creation,
so gen_z
attempts to work in a way that IDEs understand.
gen_z(|mut z| async move {
let awaited = bar().await; // Make awaitable calls in the generator
z.send(awaited).await; // Streams do not support responses; `yield` has output `()`
// Share yield helper with calls, allowing them to emit outputs while producing values
let shared_result = baz(&mut z).await;
z.send(foo + shared_result).await;
// Return is infallible; if `Result` is needed, wrap calls to comply with TryStream
}) // => Result is a futures::stream::Stream<Item = T>
Send
is required for Stream::Item
.
Send
if the provided future is also Send
.Sync
is available if Stream::Item
and the future are both Sync
.FnOnce
, so it may close over mutable references.()
, run forever, or panic.
Result<_, _>
, create an inner-future which returns Result
and
convert an Err
return to a type compatible with Stream::Item
.
TryStream
compatibility can be achieved by setting the Stream::Item
type to Result<T, TErr>
.