#iterator #chunks #loops

iter-chunks

扩展迭代器以支持分块

7 个版本

0.2.2 2023年12月7日
0.2.1 2023年11月29日
0.1.3 2022年1月22日

#262Rust 模式

Download history 3305/week @ 2024-03-13 2767/week @ 2024-03-20 1946/week @ 2024-03-27 3759/week @ 2024-04-03 2029/week @ 2024-04-10 2601/week @ 2024-04-17 3472/week @ 2024-04-24 1386/week @ 2024-05-01 1443/week @ 2024-05-08 2238/week @ 2024-05-15 1513/week @ 2024-05-22 2463/week @ 2024-05-29 2526/week @ 2024-06-05 1756/week @ 2024-06-12 1503/week @ 2024-06-19 784/week @ 2024-06-26

7,049 每月下载量
用于 risinglight

MIT/Apache

12KB
186

iter-chunks

另一个提供 chunks 方法的 Rust Iterator 的crate。

请在此处阅读 API 文档

使用方法

将以下内容添加到您的 Cargo.toml

[dependencies]
iter-chunks = "0.2"

示例

目前,仅支持在 Chunks 上使用 while 循环。

use iter_chunks::IterChunks;

let arr = [1, 1, 2, 2, 3];
let expected = [vec![1, 1], vec![2, 2], vec![3]];
let mut chunks = arr.into_iter().chunks(2);
let mut i = 0;
while let Some(chunk) = chunks.next() {
    assert_eq!(chunk.collect::<Vec<_>>(), expected[i]);
    i += 1;
}

为什么创建这个 crate?

itertools 提供了许多强大的扩展,包括 chunks。它非常实用,但它内部使用 RefCell,导致它不是 Send

这是异步上下文中非常常见的一种用法,需要 ChunksSend

async fn do_some_work(input: impl Iterator<Item = i32>) {
    for chunk in input.chunks(1024) {
        for v in chunk {
            handle(v).await
        }
        do_some_flush().await
    }
}

这个 crate 实现了不使用 RefCellchunks,因此 Chunks 既是 Send 也是 Sync。作为代价,Chunks 无法实现 Iterator(这可以通过 GAT 和 LendingIterator 解决)。

未来工作

Iterator 实现的缺乏很难使用,最佳解决方案是等待 GAT 和合适的 LendingIterator crate。但在短期内,我们可以考虑提供一些常用方法,如 nthfor_eachtry_for_each 等。

欢迎贡献。

许可证

许可协议如下

任选其一。

无运行时依赖