2 releases

Uses new Rust 2024

new 0.1.1 Mar 10, 2025
0.1.0 Mar 8, 2025

#496 in Rust patterns

Download history 169/week @ 2025-03-05

169 downloads per month

MIT license

21KB
545 lines

Parail

Parail is easily switch between sequential and parallel.

Usage

Add this to your Cargo.toml:

[dependencies]
parail = { version = "0.1", features = ["iter", "stream"] }

Examples

Parallel for Iterator

Use rayon as a parallel processing backend.

use parail::prelude::*;

fn main() {
    let values = (0..10).collect::<Vec<u64>>();
    let result = values.into_iter().par_map(do_something).collect::<Vec<_>>();
    println!("result: {:?}", result);
}

fn do_something(n: u64) -> u64 {
    std::thread::sleep(std::time::Duration::from_secs(1));
    println!("do something: {}", n);
    n + 1
}

Output example:

do something: 4
do something: 6
do something: 7
do something: 1
do something: 0
do something: 5
do something: 3
do something: 2
do something: 8
do something: 9
result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Parallel for futures::Stream

Use tokio as a parallel processing backend.

use futures::StreamExt;
use parail::prelude::*;

#[tokio::main]
async fn main() {
    let stream = futures::stream::iter(0..10);
    let result = stream.par_map_async(do_something).collect::<Vec<_>>().await;
    println!("result: {:?}", result);
}

async fn do_something(n: u64) -> u64 {
    tokio::time::sleep(std::time::Duration::from_secs(1)).await;
    println!("do something: {}", n);
    n + 1
}

Output example:

do something: 6
do something: 8
do something: 9
do something: 0
do something: 1
do something: 2
do something: 7
do something: 3
do something: 5
do something: 4
result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Implemented functions

More features will be added as needed.

  • for Iterator
    • par_map
    • par_filter
    • par_filter_map
  • for futures::Stream
    • par_map
    • par_map_async
    • par_filter
    • par_filter_map
    • par_filter_map_async

Dependencies

~0–6MB
~27K SLoC