Skip to content

KSXGitHub/pipe-trait

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pipe Trait

Test Crates.io Version

Make it possible to chain regular functions.

APIs

By adding use pipe_trait::*, 9 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)
Pipe::pipe_as_ref x.pipe_as_ref(f) f(x.as_ref())
Pipe::pipe_as_mut x.pipe_as_mut(f) f(x.as_mut())
Pipe::pipe_deref x.pipe_deref(f) f(&x)
Pipe::pipe_deref_mut x.pipe_deref_mut(f) f(&mut x)
Pipe::pipe_borrow x.pipe_borrow(f) f(x.borrow())
Pipe::pipe_borrow_mut x.pipe_borrow_mut(f) f(x.borrow_mut())

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

Explicit type annotation

use pipe_trait::*;
let x = "abc".to_string();
let a = x
    .pipe_ref::<&str, _>(AsRef::as_ref)
    .chars()
    .pipe::<Box<_>, _>(Box::new)
    .collect::<Vec<_>>();
let b = vec!['a', 'b', 'c'];
assert_eq!(a, b);

License

MIT © Hoàng Văn Khải