#generator #push #stream #range-iterator #design-pattern

无 std pushgen

处理范围和数据流的推式设计模式

2 个版本

0.0.2 2021 年 8 月 2 日
0.0.1 2021 年 6 月 29 日

#2141 in 算法

MIT/Apache

150KB
3K SLoC

pushgen

Crates.io https://docs.rs/pushgen

main 分支的 API

处理范围和数据流的推式设计模式。

这是基于 Rust 的设计模式,由 transrangers 描述。虽然链接的讨论针对的是 C++,但基于拉式迭代器的相同基本原理也适用于 Rust(由于 Rust 没有像 C++ 那样的 end 迭代器概念,因此需要进行一些修改)。

示例

fn process(x: i32) { /*...*/ }
let data = [1, 2, 3, 4, 5];

for item in data.iter().filter(|x| *x % 2 == 0).map(|x| x * 3) {
    process(item);
}

可以重写为

use pushgen::{SliceGenerator, GeneratorExt};
fn process(_x: i32) { /*...*/ }
let data = [1, 2, 3, 4, 5];
SliceGenerator::new(&data).filter(|x| *x % 2 == 0).map(|x| x * 3).for_each(process);

性能

我不做性能声明,但是有一些经过基准测试的案例表明,基于推式的方案在某些情况下优于迭代器方案,但我没有深入分析这一点。

依赖项