#pipe #trait #fp #pipeline

no-std pipe-trait

Make it possible to chain regular functions

12 releases

✓ Uses Rust 2018 edition

new 0.2.0 May 26, 2020
0.1.11 May 23, 2020

#68 in No standard library

Download history 112/week @ 2020-05-17 438/week @ 2020-05-24

122 downloads per month
Used in 3 crates

MIT license

9KB
116 lines

Pipe Trait

Test Travis Build Status Dependabot Status Crates.io Version

Make it possible to chain regular functions.

APIs

By adding use pipe_trait::*, 3 methods are added to all types:

identifier pipe syntax traditional syntax
Pipe::pipe x.pipe(f) f(x)
Pipe::pipe_ref x.pipe_ref(f) f(&x)
Pipe::pipe_mut x.pipe_mut(f) f(&mut x)

Read the docs for more information.

Usage Examples

Same type

use pipe_trait::*;
let inc = |x| x + 1;
let double = |x| x + x;
let square = |x| x * x;
let a = (123i32).pipe(inc).pipe(double).pipe(square);
let b = square(double(inc(123i32)));
assert_eq!(a, b);

Type transformation

use pipe_trait::*;
let x = 'x';
let a = x
    .pipe(|x| (x, x, x)) // (char, char, char)
    .pipe(|x| [x, x]) // [(char, char, char); 2]
    .pipe(|x| format!("{:?}", x)); // String
let b = "[('x', 'x', 'x'), ('x', 'x', 'x')]";
assert_eq!(a, b);

Pipe amongst method chain

use pipe_trait::*;
fn log<X: Debug>(x: X) -> X {
    println!("value: {:?}", x);
    x
}
my_future
    .pipe(log)
    .await
    .pipe(log)
    .inc()
    .pipe(log)
    .double()
    .pipe(log)
    .square()
    .pipe(log)
    .get()
    .pipe(log);

License

MIT © Hoàng Văn Khải

No runtime deps