TennyZhuang / iter-chunks

A `Send` version of `Iterator::chunks`

Home Page:https://crates.io/crates/iter-chunks

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

iter-chunks

Yet another crate to provides chunks method to rust Iterator.

Please read the API documentation here.

Usage

Add this to your Cargo.toml:

[dependencies]
iter-chunks = "0.2"

Examples

Currently, only while loop over Chunks is supported.

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;
}

Why create this crate?

itertools provides many awesome extensions, including chunks. It's really useful, but it use RefCell internally, causing it's not Send.

It's a very common usecase in async context, which requires Chunks to be Send:

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
    }
}

This crate implements chunks without RefCell, so Chunks is both Send and Sync. As a price, Chunks cannot implement Iterator (which can be resolved later by GAT and LendingIterator).

Future works

The lack of the Iterator implementation is very difficult to use, and the best solution is to wait for GAT and a suitable LendingIterator crate. But in the short term, we can consider providing some common methods such as nth, for_each, try_for_each, and so on.

Contributions are welcome.

License

Licensed under either of

at your option.

About

A `Send` version of `Iterator::chunks`

https://crates.io/crates/iter-chunks

License:Apache License 2.0


Languages

Language:Rust 100.0%