Expand description
Push-style design pattern for processing of ranges and data-streams.
This is a Rust-based approach to the design pattern described by transrangers.
While the discussion linked targets C++, the same basic principle of pull-based iterators applies
to Rust as well (with some modifications since Rust doesn’t have a concept of an end
iterator
like C++ does).
Example
for item in data.iter().filter(|x| *x % 2 == 0).map(|x| x * 3) {
process(item);
}
can be rewritten as
use pushgen::{SliceGenerator, GeneratorExt};
// Assume data is a slice
SliceGenerator::new(&data).filter(|x| *x % 2 == 0).map(|x| x * 3).for_each(process);
Features
std
: Enable boxing and trait implementations for types that requires std
. If this feature
is disabled, pushgen
is no_std
. This is enabled by default.
test
: Enable test tools that can be used to test generators and adaptors. This is disabled by default.
Performance
I make no performance-claims, however there are some benchmarked cases where the push-based approach wins over the iterator approach, but I have made no attempts to analyze this in any depth.
Re-exports
pub use traits::FromGenerator;
pub use traits::Generator;
pub use traits::GeneratorExt;
pub use traits::IntoGenerator;
pub use traits::ReverseGenerator;
pub use generators::from_fn;
pub use generators::from_iter;
pub use generators::SliceGenerator;
Modules
- Implements various generators.
- Generator adaptor implementations. See
GeneratorExt
for more info. - test
test
Various test utilities - Module containing the various traits used by
pushgen
.
Enums
- The enum
Either
with variantsLeft
andRight
is a general purpose sum type with two cases. - The result of generator runs.
- The result value of a
try_*
reduction. - Value-consumption result.