GitXplorerGitXplorer
K

pipe-trait

public
41 stars
1 forks
1 issues

Commits

List of commits on branch master.
Verified
d08c05ab8d0be2f60e4fa0988d02c8a316b749bc

Add GitHub Sponsors

KKSXGitHub committed 3 months ago
Verified
94c9616a4e54d9eea8482ab1fc665319b4bfe57f

Merge pull request #35 from KSXGitHub/dependabot/cargo/futures-0.3.27

KKSXGitHub committed 2 years ago
Verified
4b5314af80ae66ef38c7deaaa428fd102fdf8b93

build(deps): bump futures from 0.3.26 to 0.3.27

ddependabot[bot] committed 2 years ago
Verified
e1de5d71579926b934e2f2613bbc0cff98f78185

Merge pull request #34 from KSXGitHub/dependabot/cargo/futures-0.3.26

KKSXGitHub committed 2 years ago
Verified
a7b957de3092557d5f6fd948d6f54bfe6d5d60f5

build(deps): bump futures from 0.3.25 to 0.3.26

ddependabot[bot] committed 2 years ago
Verified
b48f523e94dd65f4aa89242cf22836c775c16125

Merge pull request #33 from KSXGitHub/dependabot/cargo/futures-0.3.25

KKSXGitHub committed 2 years ago

README

The README file for this repository.

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