17 releases
0.4.0 | Jan 24, 2022 |
---|---|
0.3.3 |
|
0.3.2 | Apr 8, 2021 |
0.3.1 | Mar 25, 2021 |
0.1.11 | May 23, 2020 |
#549 in Rust patterns
2,933 downloads per month
Used in 21 crates
(15 directly)
13KB
181 lines
Pipe Trait
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);